SQL语句LIMIT在MySQL中的性能分析
2016-05-03 21:33
661 查看
limit语句的执行时间
我的MySQL中有一个表(table),里面有450000条数据。下面这条SQL语句是将id排序后,查询从第0位(偏移量)开始,往后的10条数据。SELECT * FROM table order by id desc limit 0, 10
注意这条语句是先执行order by,再按limit要求来查询。
根据limit偏移量的不同,SQL语句执行时间的统计数据如下:
SQL | Time Cost |
---|---|
limit 0, 8000 | 0.73s |
limit 1000, 8000 | 0.92s |
limit 10000, 8000 | 2s |
limit 100000, 8000 | 3.3s |
为什么偏移量越大,查询越费时?
每条数据的实际存储长度不一样(所以必须要依次遍历,不能直接跳过前面的一部分)哪怕是每条数据存储长度一样,如果之前有过delete操作,那索引上的排列就有gap
所以数据不是定长存储,不能像数组那样用index来访问,只能依次遍历,就导致偏移量越大查询越费时
归根结底,这个问题跟MySQL的数据存储结构有关。
参考
/article/10581517.htmlhttp://stackoverflow.com/questions/1612957/mysql-index-configuration
https://explainextended.com/2009/10/23/mysql-order-by-limit-performance-late-row-lookups/
http://stackoverflow.com/questions/4481388/why-does-mysql-higher-limit-offset-slow-the-query-down
order by是如何执行的,http://stackoverflow.com/questions/6954981/how-does-mysql-order-by-implemented-internally
mysql 索引的原理,http://www.uml.org.cn/sjjm/201107145.asp
MySQL存储引擎MyISAM与InnoDB的优劣, https://www.pureweber.com/article/myisam-vs-innodb/
存储引擎,http://coolshell.cn/articles/1846.html
相关文章推荐
- Ubuntu 12.04.1 mysql从5.5升级到5.6
- MYSQL学习笔记 (一)
- 对MySQL数据库数据操作之修改
- 利用Navicat for Mysql创建数据库
- 关于mysql数据库不是3306端口用命令行远程连接的解决办法
- 利用jemalloc优化mysql
- MySQL 子查询
- mysql复制
- 跟我一起学习MySQL技术内幕(第五版):(第三章学习日记1)
- 第96课: 通过Spark Streaming的foreachRDD把处理后的数据写入外部存储系统中
- MySql模糊查询like通配符使用详细介绍
- maxscale实现读写分离
- Mysql 主从同步(转载)
- Windows下配置Mysql5.7
- mysql源码重启
- mysql数据库将BIGINT转换成日期
- VS2013与MySql建立连接;您的项目引用了最新实体框架;但是,找不到数据链接所需的与版本兼容的实体框架数据库 EF6使用Mysql的技巧
- Mysql 乐观锁
- mysql乐观锁总结和实践
- 设置过mysql远程连接后仍然无法进行远程连接 (mysql mysql报错2003 can't connect)