也谈mysql的limit优化

78 篇文章 0 订阅
21 篇文章 0 订阅
在Debian Linux上,使用MySQL 5.0.24进行了一项关于LIMIT优化的测试。测试发现,当LIMIT后面的数字小于100时,普通SQL查询效率较高;而当LIMIT数字大于100,通过子查询优化后的查询速度提高1.2到7倍,且数字越大优化效果越显著。然而,在带有WHERE条件的查询中,优化后的效率并不明显,甚至可能降低。
摘要由CSDN通过智能技术生成

测试环境

操作系统: debian linux

服务器版本: Mysql 5.0.24

Mysql数据库的Qcache缓存关闭

数据库表testtable的参数:

类型:     MyISAM 大小:     >80MB 记录规模: >50000 字段数:   >25个字段

id是主键 leibie字段上建有索引

进行数据分段测试

1>SQL不带where条件的测试

1)50290行开始 显示行 0 - 9 (10 总计, 查询花费 0.2647 秒) SQL 查询: SELECT * FROM `testtable` LIMIT 50290 , 10

显示行 0 - 9 (10 总计, 查询花费 0.0377 秒) SQL 查询: SELECT * FROM testtable WHERE id >= ( SELECT id FROM `testtable` LIMIT 50290 , 1 ) LIMIT 1 , 10

2)30290行开始

显示行 0 - 9 (10 总计, 查询花费 0.1527 秒) SQL 查询: SELECT * FROM `testtable` LIMIT 30290 , 10

显示行 0 - 9 (10 总计, 查询花费 0.0208 秒) SQL 查询: SELECT * FROM testtable WHERE id >= ( SELECT id FROM `testtable` LIMIT 30290 , 1 ) LIMIT 1 , 10

3)20290行开始

显示行 0 - 9 (10 总计, 查询花费 0.1070 秒) SQL 查询: SELECT * FROM `testtable` LIMIT 20290 , 10

显示行 0 - 9 (10 总计, 查询花费 0.0191 秒) SQL 查询: SELECT * FROM testtable WHERE id >= ( SELECT id FROM `testtable` LIMIT 20290 , 1 ) LIMIT 1 , 10

4)10290行开始

显示行 0 - 9 (10 总计, 查询花费 0.0707 秒) SQL 查询: SELECT * FROM `testtable` LIMIT 10290 , 10

显示行 0 - 9 (10 总计, 查询花费 0.0087 秒) SQL 查询: SELECT * FROM testtable WHERE id >= ( SELECT id FROM `testtable` LIMIT 10290 , 1 ) LIMIT 1 , 10

5)5290行开始

显示行 0 - 9 (10 总计, 查询花费 0.0245 秒) SQL 查询: SELECT * FROM `testtable` LIMIT 5290 , 10

显示行 0 - 9 (10 总计, 查询花费 0.0065 秒) SQL 查询: SELECT * FROM testtable WHERE id >= ( SELECT id FROM `testtable` LIMIT 5290 , 1 ) LIMIT 1 , 10

6)2590行开始

显示行 0 - 9 (10 总计, 查询花费 0.0140 秒) SQL 查询: SELECT * FROM `testtable` LIMIT 2590 , 10

显示行 0 - 9 (10 总计, 查询花费 0.0050 秒) SQL 查询: SELECT * FROM testtable WHERE id >= ( SELECT id FROM `testtable` LIMIT 2590 , 1 ) LIMIT 1 , 10

7)1000行开始

显示行 0 - 9 (10 总计, 查询花费 0.0113 秒) SQL 查询: SELECT * FROM `testtable` LIMIT 1000 , 10

显示行 0 - 9 (10 总计, 查询花费 0.0043 秒) SQL 查询: SELECT * FROM testtable WHERE id >= ( SELECT id FROM `testtable` LIMIT 1000 , 1 ) LIMIT 1 , 10

8)500行开始 显示行 0 - 9 (10 总计, 查询花费 0.0062 秒) SQL 查询: SELECT * FROM `testtable` LIMIT 500 , 10

显示行 0 - 9 (10 总计, 查询花费 0.0037 秒) SQL 查询: SELECT * FROM testtable WHERE id >= ( SELECT id FROM `testtable` LIMIT 500 , 1 ) LIMIT 1 , 10

9)300行开始

显示行 0 - 9 (10 总计, 查询花费 0.0067 秒) SQL 查询: SELECT * FROM `testtable` LIMIT 300 , 10

显示行 0 - 9 (10 总计, 查询花费 0.0055 秒) SQL 查询: SELECT * FROM testtable WHERE id >= ( SELECT id FROM `testtable` LIMIT 300 , 1 ) LIMIT 1 , 10

10)100行开始

显示行 0 - 9 (10 总计, 查询花费 0.0055 秒) SQL 查询: SELECT * FROM `testtable` LIMIT 100 , 10

显示行 0 - 9 (10 总计, 查询花费 0.0112 秒) SQL 查询: SELECT * FROM testtable WHERE id >= ( SELECT id FROM `testtable` LIMIT 100 , 1 ) LIMIT 1 , 10

2>SQL带where条件的测试(满足条件的数据记录>5000)

1)990行开始

显示行 0 - 1 (2 总计, 查询花费 0.0086 秒) SQL 查询: SELECT * FROM `testtable` WHERE leibie = 1 LIMIT 990 , 10

显示行 0 - 9 (10 总计, 查询花费 0.0123 秒) SQL 查询: SELECT * FROM `testtable` WHERE id >= ( SELECT id FROM `testtable` WHERE leibie = 1 LIMIT 990 , 1 ) LIMIT 1 , 10

2)2990行开始 显示行 0 - 9 (10 总计, 查询花费 0.0502 秒) SQL 查询: SELECT * FROM `testtable` WHERE leibie = 1 LIMIT 2990 , 10

显示行 0 - 9 (10 总计, 查询花费 0.0357 秒) SQL 查询: SELECT * FROM `testtable` WHERE id >= ( SELECT id FROM `testtable` WHERE leibie = 1 LIMIT 2990 , 1 ) LIMIT 1 , 10

3)5690行开始

显示行 0 - 9 (10 总计, 查询花费 0.0547 秒) SQL 查询: SELECT * FROM `testtable` WHERE leibie = 1 LIMIT 5690 , 10

显示行 0 - 9 (10 总计, 查询花费 0.2101 秒) SQL 查询: SELECT * FROM `testtable` WHERE id >= ( SELECT id FROM `testtable` WHERE leibie = 1 LIMIT 5690 , 1 ) LIMIT 1 , 10

测试结论:

不带where条件时,limit后的数字小于100时,正常的SQL语句效率比较高;limit后的数字大于100时,优化后的效率是没有优化的1.2 - 7 倍. limit后的数字越大,优化后的效果越明显.

带where条件时,优化的结果就不明显了,甚至是优化的结果效率更差了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值