mysql分页查询limit_MySQL分页查询优化

1bc8741c379c8434f7a49def2babf016.png

MySQL是通过select * from order limit offset, N 的方式实现分页查询的。但并不是跳过offset行,而是取offset+N行,然后放弃前offset行,返回N行,当offset很小的时候,是没有问题的,当offset很大的时候,效率就非常的地下,要么控制返回的总页数,要么对超过特定阈值的页数进行SQL优化。

一、首先应该开启慢查询跟踪慢sql

mysql> show variables like 'slow_query%';+---------------------------+----------------------------------+| Variable_name | Value |+---------------------------+----------------------------------+| slow_query_log | OFF || slow_query_log_file | /mysql/data/localhost-slow.log |+---------------------------+----------------------------------+mysql> show variables like 'long_query_time';+-----------------+-----------+| Variable_name | Value |+-----------------+-----------+| long_query_time | 10.000000 |+-----------------+-----------+

二、SQL性能优化分析工具

explainprofilingOPTIMIZER_TRACE

三、分页查询优化方案

1 确定起始ID,适合ID自增情况

这种情况下可以前端传递给后端最大的id(xxx),然后根据该id进行过滤并取得一页数据

 select * from student where id>=xxx ORDER BY id desc limit 0,20

2 使用子查询

原理和(1)一样,即取得起始的id,然后进行查询

select * from student where id>=(select id from student limit 800000,1) limit 20

这两种方案可以继续优化,速度更快:

 SELECT * FROM table WHERE id BETWEEN 1000000 AND 1000010;

3 ID不自增,需要先找到IDs,再利用聚集索引取数据,不需要回表查

 SELECT * FROM table WHERE id IN(10001, 100002, 1000003...);
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值