mysql和mariadb的主键默认顺序有什么不同?

twh00eeo  于 2021-06-21  发布在  Mysql
关注(0)|答案(1)|浏览(362)

我的测试服务器版本如下:

MySQL Server 5.7.20

MariaDB Server 10.1.9

我在两个数据库中做了相同的表。

CREATE TABLE `sort_test` (
  `ind` int(11) NOT NULL AUTO_INCREMENT,
  `time` datetime DEFAULT CURRENT_TIMESTAMP,
  PRIMARY KEY (`ind`)
) ENGINE=InnoDB;

我在两张表中插入了九条记录

insert sort_test(time) values(now());
insert sort_test(time) values(now());
insert sort_test(time) values(now());
...
insert sort_test(time) values(now());

当我执行死刑的时候 SELECT * FROM sort_test order by time desc; ,结果是相等的。

+-----+---------------------+
| ind | time                |
+-----+---------------------+
|   9 | 2018-01-05 23:43:59 |
|   8 | 2018-01-05 23:43:58 |
|   7 | 2018-01-05 23:43:57 |
|   6 | 2018-01-05 23:43:56 |
|   5 | 2018-01-05 23:43:55 |
|   4 | 2018-01-05 23:43:54 |
|   3 | 2018-01-05 23:43:53 |
|   2 | 2018-01-05 23:43:52 |
|   1 | 2018-01-05 23:43:51 |
+-----+---------------------+
9 rows in set (0.01 sec)

顺便说一下,我执行死刑的时候 select * from (SELECT * FROM sort_test order by time desc) as A; ,结果不同。

mariadb> select * from (SELECT * FROM sort_test order by time desc) as A;
+-----+---------------------+
| ind | time                |
+-----+---------------------+
|   1 | 2018-01-05 23:43:51 |
|   2 | 2018-01-05 23:43:52 |
|   3 | 2018-01-05 23:43:53 |
|   4 | 2018-01-05 23:43:54 |
|   5 | 2018-01-05 23:43:55 |
|   6 | 2018-01-05 23:43:56 |
|   7 | 2018-01-05 23:43:57 |
|   8 | 2018-01-05 23:43:58 |
|   9 | 2018-01-05 23:43:59 |
+-----+---------------------+
9 rows in set (0.02 sec)

mysql> select * from (SELECT * FROM `sort_test` order by time desc) as A;
+-----+---------------------+
| ind | time                |
+-----+---------------------+
|   9 | 2018-01-05 23:43:59 |
|   8 | 2018-01-05 23:43:58 |
|   7 | 2018-01-05 23:43:57 |
|   6 | 2018-01-05 23:43:56 |
|   5 | 2018-01-05 23:43:55 |
|   4 | 2018-01-05 23:43:54 |
|   3 | 2018-01-05 23:43:53 |
|   2 | 2018-01-05 23:43:52 |
|   1 | 2018-01-05 23:43:51 |
+-----+---------------------+
9 rows in set (0.10 sec)`

结果按不同的顺序排序。
为什么?发生什么事了?

nfs0ujit

nfs0ujit1#

没有一个 ORDER BY ,则不保证结果的顺序。你没有 ORDER BY 在外面 SELECT . 子查询传递无序的集合或行。也就是说,优化器可以随意忽略 ORDER BY 在子查询中。
优化器是否采取这种自由取决于您正在查看哪个版本的mysql分支。也许这也取决于月亮的相位。
你怎么能做出同样的结果呢?嗯,为什么? SELECT * FROM ( subquery ); 是不必要的--只需运行子查询。好吧,也许你正在做一些你简化了查询的事情??如果是这样的话,把它放回去,这样我们就可以讨论了。
几年前,当“groupwise max”代码在某些版本上无法工作时,我就被这个问题烧死了。
好吧,在不久的将来,有一个乱七八糟的方法可以做你想做的事情:添加一个 LIMIT 带大数的子查询。乱七八糟!
我同意马克的观点——你的期望是错误的。

相关问题