mysql高速分頁索引

最近遇到一個問題,mysql分頁時,隨着頁碼的增大,查詢效率越來越慢

select * from tb_mq_record limit 10, 20;   0.024秒
select * from tb_mq_record limit 100, 20;   0.037秒
select * from tb_mq_record limit 1000, 20;   0.055秒

select * from tb_mq_record limit 10000, 20;   0.120秒

select * from tb_mq_record limit 230000, 20;   50.12秒

通過分析得知,select * 查詢所有的列,表中大部分字段是沒有索引的,一般主鍵ID有索引

經過修改測試效率驚人

select id from tb_mq_record limit 88000, 20;   0.54秒

然後可以把分頁ID取出並且拼接,再次查詢,效率提升很多。

最終的SQL如下:

select * from tb_mq_record where id in (select id from tb_mq_record limit 230000, 20);

===========================

在很多分頁的程序中都這樣寫:
SELECT COUNT(*) from `table` WHERE ......;  查出符合條件的記錄總數
SELECT * FROM `table` WHERE ...... limit M,N; 查詢當頁要顯示的數據
這樣的語句可以改成:
SELECT SQL_CALC_FOUND_ROWS * FROM `table` WHERE ......  limit M, N;
SELECT FOUND_ROWS();
這樣只要執行一次較耗時的複雜查詢可以同時得到與不帶limit同樣的記錄條數
第二個 SELECT返回一個數字,指示了在沒有LIMIT子句的情況下,第一個SELECT返回了多少行 (若上述的 SELECT語句不包括 SQL_CALC_FOUND_ROWS 選項,則使用LIMIT 和不使用時,FOUND_ROWS() 可能會返回不同的結果)。



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