MySQL无order by的排序规则因素

2022-09-28 11:19:57

在没历经生产上遇到的问题前,记忆中认为MySQL的SELECT在无 order by的情况下会按ID排序返回~
然而并不是这样的!!!

1.下面篇章转载自: https://segmentfault.com/a/1190000016251056

    前两天在工作中遇到一个Mysql排序的问题,在没有加order by的时候,获取的数据顺序是随机的,而不是按照主键排序的。以往我都以往mysql的排序默认是按主键来排序的。这才发现其实不是这样的。

①. 创建一个测试数据库:

CREATETABLE`test`(`id`int(10)unsignedNOTNULLAUTO_INCREMENT,`name`char(100)DEFAULTNULL,`age`char(5)DEFAULTNULL,PRIMARYKEY(`id`),KEY`age`(`age`))ENGINE=InnoDBAUTO_INCREMENT=1DEFAULTCHARSET=utf8

②. 插入一些数据:

INSERTINTO testVALUES(NULL,'张三','5');INSERTINTO testVALUES(NULL,'李四','15');INSERTINTO testVALUES(NULL,'王五','5');INSERTINTO testVALUES(NULL,'赵信','15');INSERTINTO testVALUES(NULL,'德玛','20');INSERTINTO testVALUES(NULL,'皇子','5');INSERTINTO testVALUES(NULL,'木木','17');INSERTINTO testVALUES(NULL,'好汉','22');INSERTINTO testVALUES(NULL,'水浒','18');INSERTINTO testVALUES(NULL,'小芳','17');INSERTINTO testVALUES(NULL,'老王','5');

③. 查询5条记录:select * from test limit 5:

+----+------+------+| id| name| age|+----+------+------+|1| 张三|5||2| 张三|5||3| 李四|15||4| 王五|5||5| 赵信|15|+----+------+------+5rowsinset(0.00 sec)

现在我们只查询两个字段select id,age from test limit 5

+----+------+| id| age|+----+------+|3|15||5|15||8|17||11|17||10|18|+----+------+5rowsinset(0.00 sec)

两条查询语句的Explain执行计划:

mysql>explainselect*from testlimit5 \G***************************1.row***************************
           id:1
  select_type:SIMPLEtable: testtype:ALL
possible_keys:NULLkey:NULL
      key_len:NULL
          ref:NULLrows:12
        Extra:1rowinset(0.00 sec)

mysql>explainselect id,agefrom testlimit5 \G***************************1.row***************************
           id:1
  select_type:SIMPLEtable: testtype:index
possible_keys:NULLkey: age
      key_len:16
          ref:NULLrows:12
        Extra:Usingindex1rowinset(0.00 sec)


结论:
     MySQL在不给定order by条件的时候,得到的数据结果的顺序是跟查询列有关的。因为在不同的查询列的时候,可能会使用到不同的索引条件。Mysql在使用不同索引的时候,得到的数据顺序是不一样的。这个可能就跟Mysql的索引建立机制,以及索引的使用有关了。为了避免这种情况,在以后的项目中,切记要加上 order by

2.寻求真理


参考了部分个人以及官方文章,大致了解到在无order by的情况下,影响MySQL排序规则的因素有:

  • SELECT查询的列
  • 索引方式
  • 物理位置,即记录插入的顺序rowid(非ID的顺序)
  • 存储引擎,InnoDB、MyISM

StackOverFlow@MySQL的见解:
https://stackoverflow.com/questions/8746519/sql-what-is-the-default-order-by-of-queries

在这里插入图片描述

MySQL官网答案:
在这里插入图片描述

  • 作者:软件开发随心记
  • 原文链接:https://blog.csdn.net/vipshop_fin_dev/article/details/125136126
    更新时间:2022-09-28 11:19:57