mysql分頁場景下SQL_CALC_FOUND_ROWS代替count(*) 1. mysql5.x版本 2. mysql8.x版本 推薦閱讀

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 端。

中文——mysql5.7官方文檔

2. mysql8.x版本

在mysql8.0版本的官方文檔中,不推薦使用SQL_CALC_FOUND_ROWS選項,並計劃在後續版本中廢棄。

mysql8.0文檔


注意:

mysql會爲當前連接保存這個值,各個連接的SQL_CALC_FOUND_ROWS結果互不影響

兩條sql語句可以簡化成一條sql語句,看似簡單了,實則不然。

原因:

  1. 在有索引覆蓋的情況下,SQL_CALC_FOUND_ROWS 和 COUNT(*)的效率差不多

  2. 在沒有索引覆蓋的情況下,SQL_CALC_FOUND_ROWS的效率要遠低於COUNT(*)的效率,大概只有COUNT(*)的十分之一,甚至更低

來源——SQL_CALC_FOUND_ROWS的用法

推薦閱讀

哪個最快?SELECT SQL_CALC_FOUND_ROWS FROM table,或 SELECT COUNT(*)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章