博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
MySQL也有潜规则 – Select 语句不加 Order By 如何排序?
阅读量:6281 次
发布时间:2019-06-22

本文共 796 字,大约阅读时间需要 2 分钟。

今天遇到一个问题,有一个 Select 语句没有加 “Order By”,返回的数据是不确定的。

这种问题碰到不止几次了。追根寻底, Select 语句如果不加 “Order By”, 会怎么排序呢?

在网上搜了一下,在MySQL论坛发现了这篇文章。

http://forums.mysql.com/read.?21,239471,239688#msg-239688

简单翻译一下

* 不能依赖 MySQL 的默认排序

* 如果你想排序,总是加上 Order By
* GROUP BY 强加了 Order By (这与标准语法冲突,如果要避免,请使用 ORDER BY NULL)这里我有疑问,
到底强加了何种 Order by

对于 MyISAM 表

MySQL Select 默认排序是按照物理存储顺序显示的。(不进行额外排序).
也就是说
SELECT * FROM tbl – 会产生“表扫描”。如果表没有删除、替换、更新操作,记录会显示为插入的顺序。

InnoDB 表

同样的情况,会按主键的顺序排列。再次强调,这只是潜规则(artifact of the underlying implementation:怎么翻译?),
不靠谱的。

我的理解与推测:

“Select” 不加 “Order by”时, MySQL 会尝试以尽可能快的方法(MySQL 实际的方法不见得快)返回数据。

由于访问主键、索引大多数情况会快一些(在Cache里)所以返回的数据有可能以主键、索引的顺序输出
这里并不会真的进行排序,主要是由于主键、索引本身就是排序放到内存的,所以连续输出时可能是某种序列。
在一些情况下消耗硬盘寻道时间最短的数据会先返回。
如果只查询单个表,在特殊的情况下是有规律的。

最后总结

“Order By 是要加的”

如果谁想更深一步了解,需要看看 MySQL 的源代码了。

转载地址:http://iixva.baihongyu.com/

你可能感兴趣的文章
scaletype
查看>>
System.Runtime.InteropServices 命名空间
查看>>
浅谈百度司南大数据企业的风向标
查看>>
[原] Intellij IDEA开发Android,祝还在使用eclipse的早日脱离苦海
查看>>
在 NetBeans IDE 6.0 中分析 Java 应用程序性能
查看>>
DIOCP开源项目-DIOCP3直接发送对象,帮你处理粘包问题
查看>>
java使用httpcomponents post发送json数据
查看>>
八大排序算法总结
查看>>
yii2 关系...
查看>>
ORACLE中index的rebuild(转)
查看>>
我们的前端模版引擎更新总结
查看>>
Nginx中的rewrite指令
查看>>
堆和栈的差别(转过无数次的文章)
查看>>
history对象back()、forward()、go()
查看>>
Oracle----dual
查看>>
nim2 取石头youxi
查看>>
大数据时代的数据存储,非关系型数据库MongoDB(一)
查看>>
SQL Server 数据库设计规范
查看>>
白话经典算法系列之六 高速排序 高速搞定
查看>>
webGL
查看>>