mysql 分页优化_MySQL分页优化实验与总结

本文总结了MySQL分页查询的优化方法,包括使用索引覆盖扫描的延迟关联优化和范围扫描优化,并提供了实验过程及执行效果对比。此外,还提出了在应用程序层面的分页优化设计,如利用‘下一页’按钮和缓存策略来提高性能。
摘要由CSDN通过智能技术生成

前言

分页的sql优化是日常开发中经常遇到的问题,笔者在此做一个经验总结,并附上相应的实验过程。

实验准备

若不想亲自实验的,可以直接跳过这一节。但还是建议大家做一下实验,眼见为实。

1.安装测试数据库

本次实验使用的数据是mysql官方提供的employee数据库,mysql官方提供了一些测试数据库,可以在这里找到https://dev.mysql.com/doc/ind...。

2.修改测试数据库

安装好employee数据库后,笔者出于测试修改了一下salaries表的结构,方便测试,修改操作如下:

//修改原表的主键为id

CREATE TABLE `test_salaries` (

`id` int(11) NOT NULL AUTO_INCREMENT,

`emp_no` int(11) NOT NULL,

`salary` int(11) NOT NULL,

`from_date` date NOT NULL,

`to_date` date NOT NULL,

PRIMARY KEY (`id`),

CONSTRAINT `test_salaries_ibfk_1` FOREIGN KEY (`emp_no`) REFERENCES `employees` (`emp_no`) ON DELETE CASCADE

) ENGINE=InnoDB DEFAULT CHARSET=latin1;

//导入原表数据

INSERT INTO test_salaries (id,emp_no,salary,from_date,to_date) SELECT NULL,emp_no,salary,from_date,to_date FROM salaries;

3.完成测试环境

至此,实验的准备工作完成。可先查看一下test_salaries表中有多少数据(以下测试基于该表)

SELECT count(*)FROM test_salaries;

fb757933c4a2aeff5a5e2d4dbd1f44f6.png

优化分页SQL查询

优化分页SQL查询的思路:

尽可能使用索引覆盖扫描,而不是查询所有的列。然后根据需要做一次关联操作再返回所需的列(延迟关联)

将limit查询转换为已知位置的查询,让mysql通过范围扫描获得对应的结果(范围扫描)

延迟关联

原始sql查询语句:

SELECT * FROM test_salaries WHERE salary <= 94000 LIMIT 2677500,10;

原始sql查询语句执行效果:

487947832d061e9a6566a34bf64e6308.png

只查询id的sql语句:

SELECT id FROM test_salaries WHERE salary <= 94000 LIMIT 2677500,10;

只查询id的sql语句执行效果:

b0b14c0e97984ff4da84b3a7441e3af5.png

优化后的sql语句:

SELECT * FROM test_salaries INNER JOIN (SELECT id FROM test_salaries WHERE salary <= 94000 LIMIT 2677500,10) AS lim USING(id);

优化后的sql语句执行效果:

519b3b419e5bd39295a0c75714e5559b.png

并且我们可以注意到,这条语句的执行时间与上一条只查询id的语句的执行时间非常接近。

范围扫描

原始sql查询语句:

SELECT * FROM test_salaries limit 2844030,10;

原始sql查询语句执行效果:

b7eabc9bc972a30b2bc24018fe98e727.png

只查询id的sql语句:

SELECT id FROM test_salaries ORDER BY id limit 2844030,1;

只查询id的sql语句执行效果:

8c7c9de2df406acf8824f46d4d21be52.png

优化后的sql语句:

SELECT * FROM test_salaries WHERE id>=(SELECT id FROM test_salaries ORDER BY id limit 2844030,1) limit 0,10;

优化后的sql语句执行效果:

e2e2684402af8043fff045a6f5fcb8c1.png

同样的,我们可以发现后两句sql的执行时间比较接近。

应用程序层面的分页优化设计

除了对sql语句进行优化,我们还可以在应用程序层面对分页进行一些优化设计。

将具体的页数换成“下一页”按钮,假设每页显示20条记录,那么每次查询时都是用LIMIT返回21条记录并只显示20条,如果第21条存在,那么就显示“下一页”按钮。

先获取并缓存较多的数据(例如1000条),然后每次分页都从缓存中获取。这样做可以让应用程序根据结果集的大小采取不同策略,如果结果集少于1000,就可以在页面上显示所有的分页连接;如果结果集大于1000,则可以在页面上设计一个额外的“找到的结果多于1000条”之类的按钮。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值