ว่าด้วยเรื่อง SQL_CALC_FOUND_ROWS เขียนเมื่อ 2011.01.19 โดย

ใน MySQL มีคำสั่งช่วยตัวหนึ่งที่จะกล่าวถึงคือ SQL_CALC_FOUND_ROWS ซึ่งใช้ในคำสั่ง SELECT โดยจะช่วยเก็บค่าจำนวน record ที่พบตามคำสั่งโดยไม่สนใจคำสั่ง LIMIT เช่น

SELECT SQL_CALC_FOUND_ROWS * FROM tbl_users WHERE userrole>2 LIMIT 20,10;

เราจะได้ข้อมูลจำนวนไม่เกิน 10 records ตามปกติ แต่เมื่อเราสั่ง
SELECT FOUND_ROWS();

ในคำสั่งต่อไปจะได้จำนวน record ทั้งหมดของตาราง tbl_users ที่เข้าเงื่อนไข userrole>2 ซึ่งปกติเราอาจจะใช้คำสั่ง COUNT(*) ซึ่งให้ผลเหมือนกันก็ได้

เรามาดูความแตกต่างกันของการให้ได้มาซึ่งจำนวน record ทั้งหมดระหว่าง COUNT และ SQL_CALC_FOUND_ROWS กัน เราสร้างตารางตัวอย่างขึ้นมาดังนี้
CREATE TABLE `tbl_name` (
'field1' int(10) NOT NULL auto_increment,
'field2' int(10) NOT NULL,
'field3' int(10) NOT NULL,
'field4' varchar(32) NOT NULL,
PRIMARY KEY ('field1'),
KEY `IDX_name` ('field2','field3')
) ENGINE=MyISAM

จากนั้นใส่ตัวอย่างข้อมูลเข้าไป 1 ล้าน records
for ($i = 0; $i < 1000000; $i++) {
$field2 = $i % 1000;
mysql_query("INSERT INTO tbl_name VALUES(NULL, $field2, ROUND(RAND()*10), MD5($i));");
}

มาดูผลความเร็วการ query ของการใช้คำสั่งทั้ง 2 แบบกัน
SELECT SQL_NO_CACHE SQL_CALC_FOUND_ROWS * FROM `tbl_name` WHERE field2=10 ORDER BY field3 ASC LIMIT 10;

ใช้เวลาโดยเฉลี่ย 0.22 วินาที แล้วตามด้วยคำสั่ง
SELECT FOUND_ROWS();

ใช้เวลา 0.00 วินาที มาดูการใช้งาน COUNT() บ้าง
SELECT SQL_NO_CACHE COUNT(*) FROM `tbl_name` WHERE field2=10;

ใช้เวลาโดยเฉลี่ย 0.01 วินาที แล้วตามด้วยคำสั่ง
SELECT SQL_NO_CACHE * FROM `tbl_name` WHERE field2=10 ORDER BY field3 ASC LIMIT 10;

ใช้เวลาเฉลี่ย 0.05 วินาที

จะเห็นว่าการใช้งาน SELECT แบบธรรมดาร่วมกับ COUNT จะให้ผลเร็วกว่า (0.01+0.05) การใช้งาน SQL_CALC_FOUND_ROWS ร่วมกับ FOUND_ROWS() (0.22+0.00) เรามาดูเหตุผลของความเร็วที่แตกต่างของทั้ง 2 การทำงานกัน

โดยเราให้ MySQL อธิบายความเร็วที่ต่างกันด้วยคำสั่ง EXPLAIN จะเห็นว่าการทำงานของ COUNT() นั้นจะสามารถใช้งาน Index ที่ได้สร้างไว้ทำให้มีความเร็วกว่า SQL_CALC_FOUND_ROWS



คำเตือนคำเตือน เนื้อหาต่างๆ ในบทความ รวมถึงรูปภาพทั้งหมดในบทความนี้ เป็นความเห็นส่วนตัวของผู้เขียนแต่ละคน ซึ่งแต่ละคนได้ทำการลงทะเบียน และเขียนบทความลงใน Modoeye Articles นี้โดยไม่มีค่าธรรมเนียมใดๆ บทความเหล่านี้เป้าหมายเพื่อการศึกษา และความบันเทิงเท่านั้น การนำส่วนหนึ่งส่วนใดของบทความไปใช้งาน ควรทำการอ้างอิงถึงผู้เขียนและแหล่งที่มาด้วย