在没历经生产上遇到的问题前,记忆中认为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官网答案: