Mysql:结果的顺序,带“;选择<;fieldname>;从「;与带“的结果顺序不同”;选择*from";
我有一个mysql数据库,其中有一个表“困难”,有一些记录。如果我选择了“从困难中选择*”,我会按照添加顺序将它们取回,按主键id排序:Mysql:结果的顺序,带“;选择<;fieldname>;从「;与带“的结果顺序不同”;选择*from";,mysql,Mysql,我有一个mysql数据库,其中有一个表“困难”,有一些记录。如果我选择了“从困难中选择*”,我会按照添加顺序将它们取回,按主键id排序: mysql> select * from difficulties; +----+-------+-----------+--------+----------+-----------+ | id | value | name | letter | low_band | high_band | +----+-------+-----------
mysql> select * from difficulties;
+----+-------+-----------+--------+----------+-----------+
| id | value | name | letter | low_band | high_band |
+----+-------+-----------+--------+----------+-----------+
| 1 | 1 | very_easy | VE | 1 | 1 |
| 2 | 2 | easy | E | 2 | 5 |
| 3 | 3 | medium | M | 6 | 10 |
| 4 | 4 | hard | H | 11 | 12 |
| 5 | 0 | na | NA | 0 | 0 |
+----+-------+-----------+--------+----------+-----------+
但是,如果我“从困难中选择名称”,我会以不同的顺序取回它们:
mysql> select name from difficulties;
+-----------+
| name |
+-----------+
| easy |
| hard |
| medium |
| na |
| very_easy |
+-----------+
我的问题是:什么决定了这个顺序?这有什么逻辑吗?它是类似于“表示记录的文件恰好位于文件系统中的顺序”还是其他所有意图和目的都是随机的
谢谢,max这是正确的,而且是经过设计的:如果您不要求排序,服务器就不会麻烦排序了(排序可能是一项昂贵的操作),它将以它认为合适的任何顺序返回行。如果没有请求的顺序,记录的排序方式甚至可能在不同的查询中有所不同(尽管这不太可能) 顺序绝对不是随机的——它只是查询中的行的任何方式,正如您所看到的,即使是很小的修改也会显著地改变这种非顺序。这种“未定义”的顺序依赖于实现,不可预测,不应依赖 如果您希望对元素进行排序,请使用
orderby
子句(这就是它的目的)-例如
它将始终以升序返回按名称排序的结果。或者,如果要按主键排序,请使用“最后一个在顶部”:
SELECT name FROM difficulties ORDER BY id DESC;
您甚至可以按函数排序—如果您确实想要随机排序,请执行此操作(注意:大型表的性能非常糟糕):
有关更多详细信息和说明。从困难中选择名称。应按字母顺序返回值,因为它是一个文本字段。 我相信,
select*from难点
将以数字顺序返回。别让我那么开心
最好的做法是使用
orderby
如果您关心事物的顺序是什么,正如Piskvor所说,MySQL将按照它认为最方便的方式对查询进行排序。为了解决问题的“为什么”部分,不同的结果顺序可能是不同执行计划的副作用。如果您有一个关于困难的索引
,第二个查询将使用它,但第一个查询不会使用。如果没有ORDER BY
子句,结果将以随机顺序返回。然而,在我看来,db引擎在存储数据时返回数据的最简单(也是最快)的方法是合乎逻辑的。这就是为什么第一个结果集是按PK排序的(没有碎片,逻辑顺序与物理顺序相同)。在第二种情况下,我假设您在字段name
上有一个索引,并且对于查询select name from diffusions
,这个索引正在覆盖,因此db引擎会扫描这个索引,这就是为什么您会看到按name
排序的结果。无论如何,您不应该依赖这种“默认”排序。这实际上是错误的。除非您特别要求排序,否则SQL server不需要以任何形式的顺序返回行。(当然,orderby
是要求订购的方式,这一点是正确的)+1个优点,也说明了为什么选择是不好的-它可以强制进行全表扫描(慢),感谢Piskvor,这一切都是有意义的。我知道order by,我只是好奇在这种情况下发生了什么。我猜我错误地认为,对于dbms来说,按照记录在表中出现的顺序返回记录(或记录中的字段)是最容易/最便宜的事情,因此它会做什么,但我没有任何假设的基础:)干杯, max@Max威廉姆斯:我猜@a1ex07与覆盖索引(即name
列上的索引)是正确的,是xe吗?这将使得在仅请求名称
列时,而不是在请求所有列时,“只读取索引中的任何内容”是最便宜的操作。有关详细说明,请参见示例:
SELECT name FROM difficulties ORDER BY id DESC;
SELECT name FROM difficulties ORDER BY RAND();