MYSQL分頁 limit 太慢優化


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》書中確認的。

 

兩個方面:1-子查詢;2-JOIN分頁方式

 

解決的方法就是盡量使用索引覆蓋掃描,就是我們select后面檢出的是索引列,而不是所有的列,而且這個索引的列最好是id。然后再做一次關聯查詢返回所有的列。上述的sql可以寫成:

SELECT

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

 

Mysql的分頁查詢語句的性能分析
      MySql分頁sql語句,如果和MSSQL的TOP語法相比,那么MySQL的LIMIT語法要顯得優雅了許多。使用它來分頁是再自然不過的事情了。
 2.1最基本的分頁方式:   
SELECT ... FROM ... WHERE ... ORDER BY ... LIMIT ...  
  
在中小數據量的情況下,這樣的SQL足夠用了,唯一需要注意的問題就是確保使用了索引:
舉例來說,如果實際SQL類似下面語句,那么在category_id, id兩列上建立復合索引比較好:
SELECT * FROM articles WHERE category_id = 123 ORDER BY id LIMIT 50, 10  
  
2.2子查詢的分頁方式:
 隨着數據量的增加,頁數會越來越多,查看后幾頁的SQL就可能類似:
SELECT * FROM articles WHERE category_id = 123 ORDER BY id LIMIT 10000, 10  
  
一言以蔽之,就是越往后分頁,LIMIT語句的偏移量就會越大,速度也會明顯變慢。
此時,我們可以通過子查詢的方式來提高分頁效率,大致如下:
SELECT * FROM articles WHERE  id >=  
 (SELECT id FROM articles  WHERE category_id = 123 ORDER BY id LIMIT 10000, 1) LIMIT 10  
2.3JOIN分頁方式
SELECT * FROM `content` AS t1   
JOIN (SELECT id FROM `content` ORDER BY id desc LIMIT ".($page-1)*$pagesize.", 1) AS t2   
WHERE t1.id <= t2.id ORDER BY t1.id desc LIMIT $pagesize;   
  
     經過我的測試,join分頁和子查詢分頁的效率基本在一個等級上,消耗的時間也基本一致。
explain SQL語句:
id select_type table type possible_keys key key_len ref rows Extra
1 PRIMARY <derived2> system NULL NULL NULL NULL 1  
1 PRIMARY t1 range PRIMARY PRIMARY 4 NULL 6264 Using where
2 DERIVED content index NULL PRIMARY 4 NULL 27085 Using index
  
原文:https://blog.csdn.net/helloxiaozhe/article/details/78106709


免責聲明!

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



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