MySql分頁查詢慢的解決方案


背景

我們在開發的過程中使用分頁是不可避免的,通常情況下我們的做法是使用limit加偏移量:
select * from table where column=xxx order by xxx limit 1,20
當數據量比較小時(100萬以內),無論你翻到哪一頁,性能都是很快的。如果查詢慢,只要在
where條件和order by 的列上加上索引就可以解決。但是,當數據量大的時候(小編遇到的情況
是500萬數據),如果翻到最后幾頁,即使加了索引,查詢也是非常慢的,這是什么原因導致的呢?我們該如何解決呢?

limit分頁原理

當我們翻到最后幾頁時,查詢的sql通常是:select * from table where column=xxx order by xxx limit 1000000,20
查詢非常慢。但是我們查看前幾頁的時候,速度並不慢。這是因為limit的偏移量太大導致的。
MySql使用limit時的原理是(用上面的例子舉例):

  1. MySql將查詢出1000020條記錄。
  2. 然后舍掉前面的1000000條記錄。
  3. 返回剩下的20條記錄。

上述的過程是在《高性能MySql》書中確認的。

解決方案

解決的方法就是盡量使用索引覆蓋掃描,就是我們select后面檢出的是索引列,而不是
所有的列,而且這個索引的列最好是id。然后再做一次關聯查詢返回所有的列。
上述的sql可以寫成如下方式,最后,沒有優化過的sql,執行時間為2s多,優化后的sql執行時間是0.3秒多

SELECT
    *
FROM
    table t
INNER JOIN (
    SELECT
        id
    FROM
        table
    WHERE
        xxx_id = 143381
    LIMIT 800000,20
) t1 ON t.id = t1.id


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM