記一次mysql關於limit和orderby的優化


針對於大數據量查詢,我們一般使用分頁查詢,查詢出對應頁的數據即可,這會大大加快查詢的效率;

在排序和分頁同時進行時,我們一定要注意效率問題,例如:

select a.*
from table1 a
inner join table2 b on xx=xx
inner join table3 c  on xx=xx
and c.xx=(select b.xx from b where b.xx=?)
where a.xx=? and b.xx=? order by a.xx limit 5

在這種情況下,當數據量上來的時候,效率會非常低下,下面我們來分析一下影響性能的因素

  1. a表和b表where條件中的字段是否有索引,是否使用了索引,使用索引將會加快查詢速度,可以用explain查看
  2. c.xx=(select b.xx from b where b.xx=?)使用了子查詢,盡量杜絕沒必要的子查詢,子查詢會解釋為外鏈接,多余的連接表帶來額外的開銷
  3. 當查詢的a表字段非常多時,會對a表這些字段進行排序,然后limit進行查找前n個,拋棄前n個,再找m個進行返回

針對於上面的分析,提出以下解決方案:

  1. 增加查詢字段、排序字段的索引或聯合索引,增加表連接字段索引
  2. 把多余的子查詢去掉,條件放在表的連接上
  3. 新建子查詢,避免對過多的字段進行order by和limit,減少I/O開銷
select a.* 
from table1 a
where a.id in
( select a.id
from table1 a
inner join table2 b on xx=xx
inner join table3 c on xx=xx and xx=xx
where
a.xx=? and b.xx=?
order by a.xx
limit 5)

這樣的話會大大提升mysql查詢性能


免責聲明!

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



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