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