mysql千万级分页

Mysql数据库最简单,是利用mysql的LIMIT函数,LIMIT [offset,] rows从数据库表中M条记录(不包含m条)开始检索N条记录的语句为:

1
SELECT * FROM 表名称 LIMIT M,N

其中limit为可选项,例如我们有个student表,我们选取前5条记录可以使用下面的sql语句

1
select * from student limit 5;

问题:
千万级的表查询分页,怎么优化查询

1
2
select * from user limit 10000000,10
select * from user where name="a" limit 10000000,10

为了能更加优化查询,建立联合索引是一个好的方法,where 的条件 和主键id 作为索引 serach(name,id)

第一次建立索引时候 是id 在前 name在后,这样确实也解决这样的问题,都变成0.5s左右 ,但是还不是我想要的 ,最后上网搜索答案,发现建立联合索引顺序不同,性能也就大大提高,于是把建立索引顺序变成是id 在后 name在前。结果打出意料 ,速度变成了0.05秒 。性能大幅度提升.

开始的select id from collect order by id limit 90000,10;这么快就是因为走了索引,可是如果加了where 就不走索引了。
抱着试试看的想法加了 search(vtype,id) 这样的索引。
然后测试select id from collect where vtype=1 limit 90000,10; 非常快!0.04秒完成!
再测试: select id ,title from collect where vtype=1 limit 90000,10; 非常遗憾,8-9秒,没走search索引!
再测试:search(id,vtype),还是select id 这个语句,也非常遗憾,0.5秒。
综上:如果对于有where 条件,又想走索引用limit的,必须设计一个索引,将where放第一位,limit用到的主键放第2位,而且只能select 主键!即search(vtype,id) 这样的索引,如下查询select id from collect where vtype=1 limit 90000,10可以快速返回id,然后根据id in (xxxx)的方式去实现

参考:
https://blog.csdn.net/m0_37922390/article/details/81976014
https://blog.csdn.net/li772030428/article/details/52839987/