mysql分页优化方法

mysql分页优化方法

东正

 

https://mp.weixin.qq.com/s/2LkcDmk4a5UZnjy6pYJxHA


今天遇到开发反应分页语句很慢,马上看一下到底是啥的分页语句

 

原分页语句

SELECT * FROM `tt` LIMIT 4863000, 1000

执行这个语句需要6秒+时间

 

执行计划为全表扫描

 

在网上看到叶金荣对分页优化的文章,于是把语句修改为inner join的方式
分页改为inner join的方式
http://imysql.com/2014/07/26/mysql-optimization-case-paging-optimize.shtml




修改后的语句

SELECT * FROM `tt`
where tt.id >= (SELECT id FROM `tt` LIMIT 4863000, 1) limit 1000;

SELECT * FROM `tt` t1
INNER JOIN
(SELECT id  FROM  `tt`  LIMIT 4863000, 1000) t2 where t2.id = t1.id

 

修改之后只用了1.6秒

执行计划

 

 

修改之后的语句其实本质没有变还是扫描表得到4863000这个锚点之后的数据,但是仔细观察你会发现实际上子查询里面

只查询id这一列,因为表本身有一个最窄索引IND_RSYNCS,这个索引只有一个列RSYNCS,利用这个最窄索引扫描到4863000之后的ID值

id是主键,然后子表和主表做join,join条件是id,虽然本质没有变,但是相比改写前的语句大大节省了IO,所以查询速度有了质的提升

SELECT id FROM `tt`  order by id  LIMIT 4863000, 1000




 

using等价于join操作中的on,例如a和b根据id字段关联,那么以下等价
using(id)
on a.id=b.id

以下2个实例等价:
select a.name,b.age from test as ajoin test2 as b
on a.id=b.id
---------------------------------------------------------------
select a.name,b.age from test as ajoin test2 as b
using(id)


limit分页 最后加order by!!!!!!!!

 

limit分页 最后加order by

posted @ 2017-05-26 18:25  xiaohuazi  阅读(363)  评论(0编辑  收藏  举报