MYSQL大数据分页优化技巧---覆盖索引&&延迟关联
问题:怎么使用limit offset,N来进行大数据的分页
首先我们知道,limit offset,N的时候,Mysql的查询效率特别的低,注意是在limit大数据量的时候,测试的表的数据量是1kw条,limit 5000000,N的时候,数据变得非常的慢,当然了offset
特别小的时候,查询的速度没有什么差别,那我们来想一下是什么原因造成的?
其实原因就是Mysql并不是跳过offset行,然后单取N行,而是offset+N行,然后返回放弃前offset行,返回N行,所以这样的话,当offset特别大的时候,查询的效率就特别的低。
优化的方法:
1.我们从业务的逻辑上进行解决,比如说不允许翻页超过100页,比如百度的分页只有79页,所以我们没有必要去分那么多的页,这个是从业务的逻辑上进行控制的。
2.我们尽量的只查有索引的ID,通过索引查出来的ID,速度非常的快(b+tree原理,不用回表),然后我们再根据查出来的ID,进行回行一次性的取具体的数据,这就是覆盖索引+延迟索引
select * from `codeTage` INNER JOIN(select id from `codeTage` where `codeTage` > 1242186123123 limit 6000000,10) as x using(id)
using等价于join操作中的on,例如a和b根据id字段关联,那么一下等价using(id) on a.id = b.id 以下2个实例等价:
select a.name,b.age from test as a join test2 as b on a.id=b.id select a.name,b.age from test as a join test2 as b using(id)
也就是说,如果两个表的关联字段名是一样的,就可以使用using来建立关系,简洁明了,如果不一样,只能用On表示。