记一次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查询性能

猜你喜欢

转载自www.cnblogs.com/wulachen/p/13402458.html
今日推荐