Mysql分頁優化
在mysql中limit可以實現快速分頁,但是如果數據到了幾百萬時我們的limit必須優化才能有效的合理的實現分頁了,否則可能卡死你的服務器。當一個數據表中有幾百萬條數據的時候,就成問題了!
例如:SELECT * FROM student limit 0,10; 這個速度會很快,但是執行SELECT * FROM student limit 1000000,10;這個效率就及其低下了。這是為啥呢?原因是因為:當我們執行SQL語句的時候,一般都是從頭開始查找也就是說,我們要查找10000020條以後的數據,那麽必須先查詢前100000020條數據,才能加載到後面的數據。所以,當我們查詢的數據越靠後,使用這個方式進行查詢的效率就會越低效。
為了解決這個問題,我們可以考慮一下這種方式:每次查詢,都記錄一下上次查詢的最大ID,那麽在下次查詢的時候,只要從這個最大ID往後查找不就OK了。
日常分頁SQL語句:select id,name,content from users order by id asc limit 100000,20 掃描100020行
如果記錄了上次的最大ID:select id,name,content from users where id>100073 order by id asc limit 20 掃描20行。
很明顯,下面的效率將會是上面的幾百倍。
當一個數據庫表過於龐大,LIMIT offset, length中的offset值過大,則SQL查詢語句會非常緩慢,你需增加order by,並且order by字段需要建立索引。
如果你查詢的記錄比較大,並且數據傳輸量比較大,比如包含了text類型的field,則可以通過建立子查詢。
SELECT id,title,content FROM items WHERE id IN (SELECT id FROM items ORDER BY id limit 900000, 10);
如果limit語句的offset較大,你可以通過傳遞pk鍵值來減小offset = 0,這個主鍵最好是int類型並且auto_increment
SELECT * FROM users WHERE uid > 456891 ORDER BY uid LIMIT 0, 10;
這條語句,大意如下:
SELECT * FROM users WHERE uid >= (SELECT uid FROM users ORDER BY uid limit 895682, 1) limit 0, 10;
如果limit的offset值過大,用戶也會翻頁疲勞,你可以設置一個offset最大的,超過了可以另行處理,一般連續翻頁過大,用戶體驗很差,則應該提供更優的用戶體驗給用戶。
Mysql分頁優化