mysql的分页优化_mysql分页优化

有个200多万的用户表,显示列表时非常慢,查了一下原来使用了limit进行分页。

前几页用时很少

29e3db8147e54540828abd80cb3bb855.png

但是后面页数就简直不可忍了,实际的业务逻辑还有排序,就更慢了

930d8131460505fd8a907f0c0672c988.png

试试用查询时用带索引的键来确定范围。

f2119c3a65e7326045041e6abc816df3.png

最大的id是103948598

e4c8c529d6d9d170da3839f6f424c74c.png

时间和用limit比相差几千倍啊!

使用explain 查看一下

mysql> explain SELECT * from users LIMIT 2000000,50;

+----+-------------+-------+------+---------------+------+---------+------+---------+-------+

| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |

+----+-------------+-------+------+---------------+------+---------+------+---------+-------+

| 1 | SIMPLE | users | ALL | NULL | NULL | NULL | NULL | 2839456 | |

+----+-------------+-------+------+---------------+------+---------+------+---------+-------+

1 row in set

mysql> EXPLAIN SELECT * from users WHERE uid <= 103948598 and uid > 103948598 -50;

+----+-------------+-------+-------+---------------+---------+---------+------+------+-------------+

| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |

+----+-------------+-------+-------+---------------+---------+---------+------+------+-------------+

| 1 | SIMPLE | users | range | PRIMARY | PRIMARY | 8 | NULL | 98 | Using where |

+----+-------------+-------+-------+---------------+---------+---------+------+------+-------------+

1 row in set

可以看到 limit是扫描了所有行,再按照需要返回指定范围的行,而使用uid时仅仅是扫描了指定范围的行。

所以用uid来确定范围就很稳定,而limit时,随着页数变大,就变的很慢了。

另外还可以使用缓存来优化,请见redispage

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值