MySQL无order by的排序规则因素

x33g5p2x  于2022-06-06 转载在 Mysql  
字(2.0k)|赞(0)|评价(0)|浏览(580)

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

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

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

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

  1. CREATE TABLE `test` (
  2. `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  3. `name` char(100) DEFAULT NULL,
  4. `age` char(5) DEFAULT NULL,
  5. PRIMARY KEY (`id`),
  6. KEY `age` (`age`)
  7. ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8

②. 插入一些数据:

  1. INSERT INTO test VALUES(NULL,'张三','5');
  2. INSERT INTO test VALUES(NULL,'李四','15');
  3. INSERT INTO test VALUES(NULL,'王五','5');
  4. INSERT INTO test VALUES(NULL,'赵信','15');
  5. INSERT INTO test VALUES(NULL,'德玛','20');
  6. INSERT INTO test VALUES(NULL,'皇子','5');
  7. INSERT INTO test VALUES(NULL,'木木','17');
  8. INSERT INTO test VALUES(NULL,'好汉','22');
  9. INSERT INTO test VALUES(NULL,'水浒','18');
  10. INSERT INTO test VALUES(NULL,'小芳','17');
  11. INSERT INTO test VALUES(NULL,'老王','5');

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

  1. +----+------+------+
  2. | id | name | age |
  3. +----+------+------+
  4. | 1 | 张三 | 5 |
  5. | 2 | 张三 | 5 |
  6. | 3 | 李四 | 15 |
  7. | 4 | 王五 | 5 |
  8. | 5 | 赵信 | 15 |
  9. +----+------+------+
  10. 5 rows in set (0.00 sec)

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

  1. +----+------+
  2. | id | age |
  3. +----+------+
  4. | 3 | 15 |
  5. | 5 | 15 |
  6. | 8 | 17 |
  7. | 11 | 17 |
  8. | 10 | 18 |
  9. +----+------+
  10. 5 rows in set (0.00 sec)

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

  1. mysql> explain select * from test limit 5 \G
  2. *************************** 1. row ***************************
  3. id: 1
  4. select_type: SIMPLE
  5. table: test
  6. type: ALL
  7. possible_keys: NULL
  8. key: NULL
  9. key_len: NULL
  10. ref: NULL
  11. rows: 12
  12. Extra:
  13. 1 row in set (0.00 sec)
  14. mysql> explain select id,age from test limit 5 \G
  15. *************************** 1. row ***************************
  16. id: 1
  17. select_type: SIMPLE
  18. table: test
  19. type: index
  20. possible_keys: NULL
  21. key: age
  22. key_len: 16
  23. ref: NULL
  24. rows: 12
  25. Extra: Using index
  26. 1 row in set (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官网答案:

相关文章

最新文章

更多