1. 程式人生 > >記一次mysql關於limit和orderby的優化

記一次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查詢