zoukankan      html  css  js  c++  java
  • MySQL也有潜规则 – Select 语句不加 Order By 如何排序?

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

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

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

    http://forums.mysql.com/read.PHP?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 的源代码了。

  • 相关阅读:
    20191324读书笔记10
    20191324读书笔记十一
    实验三:个人贡献
    20191324读书笔记12
    CBMVC For Titanium Alloy 发布!
    让 PowerDesigner 支持 SQLite!
    在类库中调用资源文件实现国际化!
    理解依赖注入及其好处!
    CBMVC Titanium Framework 介绍
    .Net插件框架的实现及分析(二)
  • 原文地址:https://www.cnblogs.com/fnlingnzb-learner/p/6692680.html
Copyright © 2011-2022 走看看