【深度】MySQL分页查询优化方案

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性能优化分析工具

explain
profiling
OPTIMIZER_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...);
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值