一、测试前言
数据库:mysql
当前测试表:nodes_hierarchy目前数据量为20多万
程序分页中我们经常使用的核心sql语句select * from nodes_hierarchy limit 开始,长度(偏移量);
当nodes_hierarchy数据量小的时候,此结构语句没有性能问题,但是如果数据量很大,分页越到后面,效率越低下。
二、通过执行时间来测试
select * from nodes_hierarchy limit 0,20 0.002s select * from nodes_hierarchy limit 10000,20 0.007s select * from nodes_hierarchy limit 11000,20 0.006s select * from nodes_hierarchy limit 110000,20 0.044s select * from nodes_hierarchy limit 260000,20 0.102s
三、通过查询行数来测试,使用explain
explain select * from nodes_hierarchy limit 260000,20
结果提示:查询行数272377 (是nodes_hierarchy表中数据的总数)
说明是,对表进行全量查询之后,获取我们所要的数据。全量查询当然是,数据越大性能越差
四、优化
直接上语句
select * from nodes_hierarchy where id >= (select id from nodes_hierarchy order by id asc limit 260000,1) limit 20 0.061s select * from nodes_hierarchy n join (SELECT id from nodes_hierarchy order by id asc limit 260000,20) b on n.id = b.id 0.061s
比较:select * from nodes_hierarchy limit 260000,20 0.102s 发现的确快了很多。
仔细看上面2个优化之后的查询语句,发现在子查询中用到了主键id,其实本质是利用主键索引,因为利用索引查找有优化算法,且数据就在查询索引上面,不用再去找相关的数据地址了,这样节省了很多时间。另外Mysql中也有相关的索引缓存,在并发高的时候利用缓存就效果更好了。
总结:
limit语句的查询时间与起始记录的位置成正比
mysql的limit语句是很方便,但是对记录很多的表并不适合直接使用
.....