MYSQL Optimizing LIMIT Queries
如果要指定查询的数据行数,在查询语句中使用limit子句,而不是获取所有数据行结果集,然后去掉没用的数据。
MYSQL有时会对没有having子句,带有limit关键字的查询进行优化:
1:如果用limit子句选择很少的行数据集,mysql会利用索引来代替全表扫描;
2:如果组合使用limit 和order by 查询,mysql会在满足limit数量限制时停止sort,而不是对所有数据sort.如果利用index来进行排序,过程很快,但如果走的是filesort,所有 匹配该查询的结果集(except limit)都会被获取,在满足limit子句数据行找到之前,大部分(全部)数据都会被sort(即找到所有满足条件的数据行,然后排序找到满足limit的前几条数据,然后再停止)。
3:一个order by查询带有和不带有limit的返回集可能以不同的顺序,下面有介绍:
4:如果组合使用limit和distinct关键字,mysql在找到row_count的唯一数据行时,立刻停止。
5:一些情况下,group by(order by)可以通过读取key的顺序,此时,limit row_count可以限制不必要计算的group by值。
6: 当客户端收到指定行数的时候,会中断查询,除非使用了SQL_CALC_FOUND_ROWS。
7: limit 0直接返回空集,可以用来检查查询是否合法。
8: 当服务使用临时表,会使用limit子句来计算需要多少空间。
当在order by列中具有相同值的很多行时,mysql server会不确定的以任何顺序返回这些行数据,换句话说,排序结果的顺序对非order by列来说是不确定的。
mysql> SELECT * FROM ratings ORDER BY category;
+----+----------+--------+
| id | category | rating |
+----+----------+--------+
| 1 | 1 | 4.5 |
| 5 | 1 | 3.2 |
| 3 | 2 | 3.7 |
| 4 | 2 | 3.5 |
| 6 | 2 | 3.5 |
| 2 | 3 | 5.0 |
| 7 | 3 | 2.7 |
+----+----------+--------+
mysql> SELECT * FROM ratings ORDER BY category LIMIT 5;
+----+----------+--------+
| id | category | rating |
+----+----------+--------+
| 1 | 1 | 4.5 |
| 5 | 1 | 3.2 |
| 4 | 2 | 3.5 |
| 3 | 2 | 3.7 |
| 6 | 2 | 3.5 |
+----+----------+--------+
如果要确定不适用limit情况下返回集的顺序(最好加上一个唯一列),如下:如果id 列为unique,可以这么使用:
mysql> SELECT * FROM ratings ORDER BY category, id;
+----+----------+--------+
| id | category | rating |
+----+----------+--------+
| 1 | 1 | 4.5 |
| 5 | 1 | 3.2 |
| 3 | 2 | 3.7 |
| 4 | 2 | 3.5 |
| 6 | 2 | 3.5 |
| 2 | 3 | 5.0 |
| 7 | 3 | 2.7 |
+----+----------+--------+
mysql> SELECT * FROM ratings ORDER BY category, id LIMIT 5;
+----+----------+--------+
| id | category | rating |
+----+----------+--------+
| 1 | 1 | 4.5 |
| 5 | 1 | 3.2 |
| 3 | 2 | 3.7 |
| 4 | 2 | 3.5 |
| 6 | 2 | 3.5 |
+----+----------+--------+
SELECT ... FROM single_table ... ORDER BY non_index_column [DESC] LIMIT [M,]N;
如果排序的个数N刚好能在sort buffer里面,那么服务就可以避免执行文件合并和并且把sort buffer当做一个优先级队列来处理:
1: 扫描表,把选中的行都插入队列中,如果队列满了把最后一个剔除掉。
2: 然后返回前N行,如果有跳过M,那么先跳过M行,然后返回之后的N行记录。
之前使用的处理方法:
1: 扫描表,重复下面的步骤直到结束
2:输入select row直到sort buffer满。
3: 写入前N行到buffer,然后把前N行合并到文件。
4:排序合并文件并返回前N行。
扫描表的花费和队列和文件合并一样,所以优化器在选择的时候是根据其他花费的:
1: 队列的方法会使用很多cpu来插入到队列。
2: 合并文件会使用IO来读写文件,cpu来排序。
优化器在行数和不同值N之间平衡。
MYSQL Optimizing LIMIT Queries的更多相关文章
- MySQL的limit查询优化
MySQL的limit查询优化以下的文章主要是对MySQL limit查询优化的具体内容的介绍,我们大家都知道MySQL数据库的优化是相当重要的.其他最为常用也是最为需要优化的就是limit.MySQ ...
- Mysql的“Limit”操作
Limit操作: ,; #返回第6-15行数据 ; #返回前5行 ,; #返回前5行 性能优化: 基于MySQL5.0中limit的高性能,我对数据分页也重新有了新的认识.测试SQL语句1: Sele ...
- mysql中limit与in不能同时使用的解决方式.
mysql中limit与in不能同时使用的解决方式. 分类: MySQL2011-10-31 13:53 1277人阅读 评论(0) 收藏 举报 mysqlsubquery MySQL5.1中子查询是 ...
- Hbase之取出行数据指定部分+版本控制(类似MySQL的Limit)
import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.hbase.CellScanner; import org. ...
- Hbase之取出行数据指定部分(类似MySQL的Limit)
import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.hbase.CellScanner; import org. ...
- SQL(基于MySQL)——LIMIT用法
mysql支持limitselect * from tablename limit n,mn:表示从第几行开始,mysql的行数是从0开始标注. m:表示要显示几行: 例如:select * from ...
- MYSQL分页limit速度太慢优化方法
http://www.fienda.com/archives/110 在mysql中limit可以实现快速分页,但是如果数据到了几百万时我们的limit必须优化才能有效的合理的实现分页了,否则可能卡死 ...
- mysql中limit的用法实例解析
mysql中limit的用法解析. 在mysql中,select * from table limit m,n.其中m是指记录开始的index,从0开始,n是指从第m条开始,取n条. 例如: mysq ...
- MSSQL 如何实现 MySQL 的 limit 查询方式 (转)
不知为何,MSSQL 中没有 limit 这个极为重要的查询方式,熟悉 MySQL 的朋友都知道,MySQL 的 limit 对于实现分页和一些限制结果集的应用中非常方便.没有不要紧,我们可以用其他方 ...
随机推荐
- Vue 爬坑之路(三)—— 使用 vue-router 跳转页面
使用 Vue.js 做项目的时候,一个页面是由多个组件构成的,所以在跳转页面的时候,并不适合用传统的 href,于是 vue-router 应运而生. 官方文档: https://router.vue ...
- 使用 BeanUtils 报错解决记录
在使用BeanUtils.populate方法时,报错如下: java.lang.NoClassDefFoundError: org/apache/commons/collections/FastHa ...
- Swift语言中与C/C++和Java不同的语法(三)
这一部分的主要内容是Swift中的Collections 我们知道Java中的Collection基本上是每一个Java程序猿接触到的第一个重要的知识点. 在Swift中也不例外,Swift中的Col ...
- [js高手之路]寄生组合式继承的优势
在之前javascript面向对象系列的文章里面,我们已经探讨了组合继承和寄生继承,回顾下组合继承: function Person( uName ){ this.skills = [ 'php', ...
- .NET Core+MySql+Nginx 容器化部署
.NET Core容器化@Docker .NET Core容器化之多容器应用部署@Docker-Compose .NET Core+MySql+Nginx 容器化部署 GitHub-Demo:Dock ...
- angular4.0 配置打包路径以及资源文件404问题
一.配置打包路径 配置打包路径,便于提交到SVN,不用每次都复制粘贴 在.angular-cli.json文件中修改"outDir"的路径,打包后的项目将发布到路径下 二.解决打包 ...
- 一种基于http协议的敏感数据传输方案
最近公司需要通过公网与其它平台完成接口对接,但是基于开发时间和其它因素的考虑,本次对接无法采用https协议实现.既然不能用https协议,那就退而求其次采用http协议吧! 那么问题来了!在对接的过 ...
- 基于TCP协议的项目架构之Socket流传输的实现
项目背景 某银行的影像平台由于使用时间长,服务器等配置原因,老影像系统满足不了现在日益增长的数据量的需求,所以急需要升级改造.传统的影像平台使用的是Oracle数据库和简单的架构来存储数据(视频.图 ...
- 用mint ui去实现滚动选择日期并可以关闭拾取器
转发要备注出处哈,么么哒 注释的那些部分都是我在尝试的时候写得,留给自己看得,删除不影响效果哈,希望对你们有帮助,比较忙可能写得很粗糙,不好意思,有空再改了 实例一: <template&g ...
- liveshow回顾
在2017年8月14号的一天接到一个即看即买的项目,大致功能如下 1.现场走秀直播同步到H5页面 2.实时显示直播间人数 3.点赞并实时显示给用户 4.在某个时间点,可以全体推送一些消息给所有用户 5 ...