mysql分页limit的优化

在我的index_innodb数据库表中有一千万条数据(可以用存储过程添加数据)
表结构如下:
在这里插入图片描述
部分数据如下:
在这里插入图片描述
现在进行分页查询:

sql语句总耗时(秒)
(从第10页查询)SELECT * FROM index_innodb LIMIT 100,100.018 sec
(从第5万页查询)SELECT * FROM index_innodb LIMIT 5000000,103.940 sec
(查询最后一页)SELECT * FROM index_innodb LIMIT 9999990,108.752 sec

数据表明:当我执行分页查询的时候,越往后查询的页执行的越慢
原因:在执行limit a,b 时候,系统会扫描a行之前所有的数据,虽然这些数据是没有用的,接着扫描a行之后的b行,只有这些数据游泳。但是这就导致系统越往后扫描,占用的时间越长,如果数据很多的话,数据库压力就很大了。

优化

按照上面所说,每次分页查询都要扫描a行之前的所有数据,那么有没有办法让数据库跳过这一步,直接扫到a行。答案是索引或者复合索引(主键默认加索引),索引可以直接找到第a行数据,所以解决办法如下。

sql语句总耗时(秒)
SELECT * FROM index_innodb WHERE id>100 LIMIT 100.002 sec
SELECT * FROM index_innodb WHERE id>5000000 LIMIT 100.002 sec
SELECT * FROM index_innodb WHERE id>9999990 LIMIT 100.004 sec

注意:运用此方法,数据id必须是连续的

其实最快的sql语句是下面这句

SELECT * FROM index_innodb WHERE id BETWEEN 101 AND 110;
SELECT * FROM index_innodb WHERE id BETWEEN 5000001 AND 5000010;
SELECT * FROM index_innodb WHERE id BETWEEN 99999991 AND 10000000;

另外:如果需要查询 id 不是连续的一段,最佳的方法就是先找出 id ,然后用 in 查询

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值