1. 程式人生 > >Mysql分頁優化

Mysql分頁優化

mce 及其 過大 order by 意義 可能 就是 處理 con

  在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字段需要建立索引。

  如果使用子查詢去優化LIMIT的話,則子查詢必須是連續的,某種意義來講,子查詢不應該有where條件,where會過濾數據,使數據失去連續性。
  如果你查詢的記錄比較大,並且數據傳輸量比較大,比如包含了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分頁優化