1. mysql5.x版本
分頁場景下,我們希望語句在沒有limit的情況下將返回多少行,而無需再次運行該語句。要獲取此行行數,請在select語句中包含
SQL_CALC_FOUND_ROWS
的選項,然後在調用FOUND_ROWS();
語法:
mysql> SELECT SQL_CALC_FOUND_ROWS * FROM tbl_name
-> WHERE id > 100 LIMIT 10;
mysql> SELECT FOUND_ROWS();
第二個SELECT語句返回一個數字,該數字指示如果不使用LIMIT語句寫入第一個SELECT將會返回多少行。
如果您使用的是SELECT SQL_CALC_FOUND_ROWS
,MySQL 必須計算整個結果集中有多少行。但是,這比不使用LIMIT再次運行查詢要快,因爲不需要將結果集發送到 Client 端。
2. mysql8.x版本
在mysql8.0版本的官方文檔中,不推薦使用SQL_CALC_FOUND_ROWS
選項,並計劃在後續版本中廢棄。
注意:
mysql會爲當前連接保存這個值,各個連接的SQL_CALC_FOUND_ROWS結果互不影響
兩條sql語句可以簡化成一條sql語句,看似簡單了,實則不然。
原因:
在有索引覆蓋的情況下,SQL_CALC_FOUND_ROWS 和 COUNT(*)的效率差不多
在沒有索引覆蓋的情況下,SQL_CALC_FOUND_ROWS的效率要遠低於COUNT(*)的效率,大概只有COUNT(*)的十分之一,甚至更低
推薦閱讀
哪個最快?SELECT SQL_CALC_FOUND_ROWS FROM table
,或 SELECT COUNT(*)