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沒有修複之前,這些功能不值得使用。