关注联楷|返回首页 | 网站案例 | 帮助中心

合作共赢、快速高效、优质的网站建设提供商

上海网站建设 

服务热线:021-61394118

上海联楷科技

建网站也谈mysql的limit优化

作者:佚名   时间:2012-05-04   分享到:

测试环境



操作系统: 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条件时,优化的结果就不明显了,甚至是优化的结果效率更差了



如没特殊注明,文章均为上海联楷网络原创,转载请注明来自:http://www.linksj.com/contact/20151229/n7565.html

上海联楷网络新闻