MYSQL大数据量列表分页查询优化方案

问题描述:

项目中,一张表里数据有几百万条,表有索引。在后台管理系统中,进行列表分页查询时,分页页数越大,查询速度越慢,还会报出慢查询,如何对其进行优化呢?

在这里插入图片描述

原因分析:

假设查询第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查询比较快,然后内连接的时候,只从全部数据中找条件满足的,所以效率很高,看执行时间:
MYSQL大数据量列表分页查询优化方案_第1张图片
可以看出,方案一效率是最快的,方案二其次,原始的sql查询效率是最慢的。

你可能感兴趣的:(日常开发总结,mysql,sql,数据库)