天天看點

影響LIMIT子句使用的一個mysql配置項

select FOUND_ROWS()總是傳回上一次select所傳回的行數。它的結果受到上一次select中是否使用SQL_CALC_FOUND_ROWS的

影響

測試如下:

1.運作語句:select SQL_CALC_FOUND_ROWS * from penalties where amount>=20 limit 2

然後運作:select FOUND_ROWS();

傳回的行數是:4

2.不使用SQL_CALC_FOUND_ROWS

select * from penalties where amount>=20 limit 2

傳回的行數是:2

結論:使用SQL_CALC_FOUND_ROWS後(在幕後計算找到的總行數,儲存起來後面使用),FOUND_ROWS()是抛掉了LIMIT之後的結果數。

不使用SQL_CALC_FOUND_ROWS,FOUND_ROWS()是select語句傳回的最終結果數。

select FOUND_ROWS()的最大用處是在翻頁中,預先将總數儲存在FOUND_ROWS()中。每次點選下一頁的時候,顯示總記錄數,

就是讀取FOUND_ROWS()函數的值。這樣省去查詢資料庫,掃描表所有記錄。

所使用到的特性是:通過設定SQL_CALC_FOUND_ROWS,FOUND_ROWS()的結果不受limit的影響,傳回的将會是符合條件除limit

外的總行數。

網上看了一下,列出的問題如下:

在最上面的更新裡有mysql的bug連接配接,4.1, 5.0, 5.1版本都有這個問題。mysql對FOUND_ROWS()函數優化不夠,比如下面兩個

SQL:

select sql_calc_found_rows last_name from contacts group by c_id order by last_name

limit 1;

有sql_calc_found_rows(19.38 秒)

select last_name from contacts group by c_id order by last_name limit 1;

沒有 sql_calc_found_rows(3.13 秒)

差别高達8秒,可見mysql這方面的問題還是很大的,在這個bug沒有修複之前,這些功能不值得使用。