MySQL中ORDER BY与LIMIT一起使用(有坑)
1. 现象与问题
ORDER BY排序后,用LIMIT取前几条,发现返回的结果集的顺序与预期的不一样
下面是我遇到的问题:




可以看到,带LIMIT与不带LIMIT的结果与我预期的不一样,而且“很不可思议”,真是百思不得其解
后来百度了一下,如果order by的列有相同的值时,mysql会随机选取这些行,为了保证每次都返回的顺序一致可以额外增加一个排序字段(比如:id),用两个字段来尽可能减少重复的概率
于是,改成 order by status, id;

问题虽然是解决了,但还是看看官方文档上怎么说的吧!
2. LIMIT查询优化
——摘自“LIMIT查询优化”
如果你只需要结果集中的指定数量的行,那么请在查询中使用LIMIT子句,而不是抓取整个结果集并丢弃剩下那些你不要的数据。
MySQL有时会优化一个包含LIMIT子句并且没有HAVING子句的查询:
- MySQL通常更愿意执行全表扫描,但是如果你用LIMIT只查询几行记录的话,MySQL在某些情况下可能会使用索引。
- 如果你将LIMIT row_count子句与ORDER BY子句组合在一起使用的话,MySQL会在找到排序结果的第一个row_count行后立即停止排序,而不是对整个结果进行排序。如果使用索引来完成排序,这将非常快。如果必须执行文件排序,则在找到第一个row_count行之前,选择所有与查询匹配但不包括LIMIT子句的行,并对其中大部分或所有行进行排序。一旦找到第一个row_count之后,MySQL不会对结果集的任何剩余部分进行排序。这种行为的一种表现形式是,一个ORDER BY查询带或者不带LIMIT可能返回行的顺序是不一样的。
- 如果LIMIT row_count与DISTINCT一起使用,一旦找到row_count惟一的行,MySQL就会停止。
- LIMIT 0 可以快速返回一个空的结果集,这是用来检测一个查询是否有效的一种很有用的方法。
- 如果服务器使用临时表来解析查询,它将使用LIMIT row_count子句来计算需要多少空间。
- 如果ORDER BY不走索引,而且后面还带了LIMIT的话,那么优化器可能可以避免用一个合并文件,并使用内存中的filesort操作对内存中的行进行排序。
如果ORDER BY列有多行具有相同的值,服务器可以自由地以任何顺序返回这些行,并且根据总体执行计划可能以不同的方式返回。换句话说,这些行的排序顺序对于无序列是不确定的。
影响执行计划的一个因素是LIMIT,因此对于一个ORDER BY查询而言,带与不带LIMIT返回的行的顺序可能是不一样的。
看下面的例子:

包含LIMIT可能会影响每一个category行的顺序。例如:

如果你需要确保无论带不带LIMIT都要以相同的顺序返回,那么你可以在ORDER BY中包含附加列,以使顺序具有确定性。例如:

3. 小结
1、如果你只需要结果集中的某几行,那么建议使用limit。这样这样的话可以避免抓取全部结果集,然后再丢弃那些你不要的行。
2、对于order by查询,带或者不带limit可能返回行的顺序是不一样的。
3、如果limit row_count 与 order by 一起使用,那么在找到第一个row_count就停止排序,直接返回。
4、如果order by列有相同的值,那么MySQL可以自由地以任何顺序返回这些行。换言之,只要order by列的值不重复,就可以保证返回的顺序。
5、可以在order by子句中包含附加列,以使顺序具有确定性。
4. 文档
https://dev.mysql.com/doc/refman/5.7/en/limit-optimization.html
https://dev.mysql.com/doc/refman/5.7/en/
MySQL中ORDER BY与LIMIT一起使用(有坑)的更多相关文章
- MySQL中 ORDER BY 与 LIMIT 的执行顺序
如下: ORDER BY 与 LIMIT 的执行顺序:ORDER BY > LIMIT ORDER BY 与 LIMIT 的编写顺序:ORDER BY > LIMIT 正确写法: sele ...
- MySQL中 order by 与 limit 的执行顺序以及使用实例
在 MySQL 执行查询的时候,我们可能既要对结果集进行排序又要限制行数,那么此时 order by 与 limit 的执行顺序是怎么样的呢? order by与limit的执行顺序是:先执行orde ...
- MySQL中order by中关于NULL值的排序问题
MySQL中order by 排序遇到NULL值的问题 MySQL数据库,在order by排序的时候,如果存在NULL值,那么NULL是最小的,ASC正序排序的话,NULL值是在最前面的. 如果我们 ...
- mysql 中order by 与group by的顺序
mysql 中order by 与group by的顺序 是: select from where group by order by 注意:group by 比order by先执行,order b ...
- mysql同时使用order by和limit查询时的一个严重隐患 -- 丢失数据
转自: https://blog.csdn.net/tsxw24/article/details/44994835 我经常使用order by和limit来做数据分页显示并排序,一直也没发现过什么问题 ...
- 采坑笔记——mysql的order by和limit排序问题
背景说明 今天写出一个十分弱智的bug,记录一下,提醒自己以后别这种犯错,不怕丢人哈~ 在写一个分页查询记录的sql时,要根据添加的时间逆序分页输出,之前的写法是酱紫 select record.a, ...
- MySQL中order by排序时,数据存在null咋办
order by排序是最常用的功能,但是排序有时会遇到数据为空null的情况,这样排序就会乱了,这里以MySQL为例,记录我遇到的问题和解决思路. 问题: 网页要实现table的行鼠标拖拽排序,我用A ...
- mysql中order by优化的那些事儿
为了测试方便和直观,我们需要先创建一张测试表并插入一些数据: CREATE TABLE `shop` ( `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '记 ...
- MySql中order by和union all同时使用
() UNION ALL () 两边的语句加上括号就可以了
随机推荐
- Hadoop- 集群启动详解
NameNode启动过程详解 第一次启动:HDFS格式化后,生成fsimage文件 hdf
- table+css与xhtmL+css实现同一登陆框(代码片段)
1.从网上下载了一个不错的登录框样式(table结合css布局): 2.初学xhtmL,自己改写了一下,希望有用 3. 我怎么不会上传截图呢? 1. [代码]xhtml_css组合 < ...
- Codeforces 455B A Lot of Games:博弈dp【多局游戏】
题目链接:http://codeforces.com/problemset/problem/455/B 题意: 给你n个字符串,然后进行k局游戏. 每局游戏开始有一个空串,然后双方轮流给这个串的末尾添 ...
- POJ 2831 Can We Build This One:次小生成树【N^2预处理】
题目链接:http://poj.org/problem?id=2831 题意: 给你一个图,每条边有边权. 然后有q组询问(i,x),问你如果将第i条边的边权改为x,这条边是否有可能在新的最小生成树中 ...
- windows 批处理ping ip
//pingSingleIp ;;@Echo off @for /f "tokens=1-4 delims=." %%i in (ip.txt) do (@ping -w 600 ...
- docker 安装过程
- Linux-安装ssh服务
问题描述: 有些版本的linux系统,如Ubuntn 16 ,安装完成后缺少ssh服务, 所以putty链接会出现访问失败的情况. 解决办法: 在linux中安装ssh服务,并启动 1.安装 sudo ...
- freeMarker(十)——模板语言之内建函数
学习笔记,选自freeMarker中文文档,译自 Email: ddekany at users.sourceforge.net 1.字符串内建函数 这些内建函数作用于表达式左侧的字符串值. 如果左侧 ...
- ONTAK2010 Peaks加强版
给一个图,每个点有点权,$q$ 次询问从 $x$ 开始只走点权小于等于 $y$ 的路径能到的点中第 $k$ 大的点权,无解输出 -1 强制在线 请注意因为这个 sb 博主为了描述方便,这里的题目描述用 ...
- 交互式 shell 玩转 Python
Python 编程语言已经成为 IT 中使用的最流行的语言之一.成功的一个原因是它可以用来解决各种问题.从网站开发到数据科学.机器学习到任务自动化,Python 生态系统有丰富的框架和库.本文将介绍 ...
