limit语句的查询耗时研究,sql性能问题
2018-09-03 11:58
387 查看
limit语句的执行时间
我的MySQL中有一个表(table),里面有450000条数据。下面这条SQL语句是将id排序后,查询从第0位(偏移量)开始,往后的10条数据。
[code]SELECT * FROM table order by id desc limit 0, 10
- 1
注意这条语句是先执行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的数据存储结构有关。
参考
- https://www.geek-share.com/detail/2573110761.html
- http://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/
- 存储引擎,https://www.geek-share.com/detail/2470319453.html
相关文章推荐
- sql查询语句性能问题及编写时需要注意的地方
- 关于oracle sql语句查询时 表名和字段名要加双引號的问题具体解释
- 解决SQL语句中含有中文字符无法查询问题
- 查询从M条到N条记录的问题可扩展到分页查询SQL语句
- sql语句中的字段类型与sql表字段类型不一致可能引起的性能问题
- 关于SQL中Between语句查询日期的问题
- Mysql 性能优化7【重要】sql语句的优化 浅谈MySQL中优化sql语句查询常用的30种方法(转)
- MySQL 5.7.9版本sql_mode=only_full_group_by问题 用到GROUP BY 语句查询时com.mysql.jdbc.exceptions.jdbc4.MySQLSyn
- 关于SQL中Between语句查询日期的问题
- SQL语句的性能查询
- Oracle数据库SQL语句绑定变量一----性能问题
- 找出存在性能问题的sql语句
- Oracle--查询正在执行和执行过的SQL语句及语句执行性能
- MySQL大数据量分页查询方法及其优化 ---方法1: 直接使用数据库提供的SQL语句 ---语句样式: MySQL中,可用如下方法: SELECT * FROM 表名称 LIMIT M,N ---适
- 数据库性能优化分析案例---解决SQL语句过度消耗CPU问题
- Sql语句性能查询
- sql语句无错误 order by 和limit一起用数据查询不准有重复
- SQL Server SQL性能优化之--pivot行列转换减少扫描计数优化查询语句
- [轉]mysql limit后的变量问题,sql语句的prepare
- SQL语句导致性能问题