赞
踩
项目中,一张表里数据有几百万条,表有索引。在后台管理系统中,进行列表分页查询时,分页页数越大,查询速度越慢,还会报出慢查询,如何对其进行优化呢?
假设查询第100000页数据,每页10条,则分页查询的语句是select * from table where … limit 1000000,10。
在mysql的底层处理中,对于上述的sql语句处理,是先排序,然后取出1000010条数据,然后舍去前100000条数据,返回10条数据,这就是查询慢的原因。即使有索引,在大数据量上,效率也会降低很多。
方案一:
对sql语句进行下面的优化:
select * from table where ... and id>1000000 limit 10;
这样的话,sql就不会把前100000条也查出来,然后排序了,而是直接查询第100000条数据,我们看其执行时间:
可以看到,效率提升了很多。但是这个方案有瑕疵,假如id不是自增,或者id中间没有连续起来,对分页都有影响,所以,这种方式不是十全十美的方式。
方案二:
对sql进行如下的优化:
select * from (select id from table limit 1000000,10) b, table a where a.id=b.id
这个sql是先只查询id出来,然后再拿id关联本表全部数据,进行内连接查询。id查询比较快,然后内连接的时候,只从全部数据中找条件满足的,所以效率很高,看执行时间:
可以看出,方案一效率是最快的,方案二其次,原始的sql查询效率是最慢的。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。