記一次mysql關於limit和orderby的優化
阿新 • • 發佈:2020-07-30
針對於大資料量查詢,我們一般使用分頁查詢,查詢出對應頁的資料即可,這會大大加快查詢的效率;
在排序和分頁同時進行時,我們一定要注意效率問題,例如:
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
在這種情況下,當資料量上來的時候,效率會非常低下,下面我們來分析一下影響效能的因素
- a表和b表where條件中的欄位是否有索引,是否使用了索引,使用索引將會加快查詢速度,可以用explain檢視
-
c.xx=(select b.xx from b where b.xx=?)使用了子查詢,儘量杜絕沒必要的子查詢,子查詢會解釋為外連結,多餘的連線錶帶來額外的開銷
- 當查詢的a表字段非常多時,會對a表這些欄位進行排序,然後limit進行查詢前n個,拋棄前n個,再找m個進行返回
針對於上面的分析,提出以下解決方案:
- 增加查詢欄位、排序欄位的索引或聯合索引,增加表連線欄位索引
- 把多餘的子查詢去掉,條件放在表的連線上
- 新建子查詢,避免對過多的欄位進行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查詢