MySQL默认顺序取决于WHERE

Nin*_*Nin 6 mysql

可能重复:
MySQL中的默认排序 - 排序(ALTER TABLE ... ORDER BY ...;)

我有这样一张桌子:

CREATE TABLE IF NOT EXISTS `table_test` (
  `id` mediumint(8) unsigned NOT NULL,
  `country` enum('AF','AX','AL') DEFAULT NULL,
  `number` tinyint(3) unsigned DEFAULT NULL,
  `sort_order` double unsigned NOT NULL DEFAULT '0',
  PRIMARY KEY (`id`),
  KEY `country` (`country`),
  KEY `id` (`id`,`country`)
) ENGINE=MEMORY DEFAULT CHARSET=latin1;
Run Code Online (Sandbox Code Playgroud)

我有一个表,我更改了默认顺序,如:

ALTER TABLE test_table ORDER BY sort_order ASC;
Run Code Online (Sandbox Code Playgroud)

此表永远不会更新,并且在其生命周期中不会删除或添加任何记录.如果我使用以下查询,这一切似乎都有效:

SELECT * FROM test_table LIMIT 10
Run Code Online (Sandbox Code Playgroud)

它以正确的顺序返回10条记录.

即使我使用:

SELECT * FROM test_table WHERE num=3
Run Code Online (Sandbox Code Playgroud)

它以正确的顺序返回结果.

但如果我这样做

SELECT * FROM test_table WHERE country='AX'
Run Code Online (Sandbox Code Playgroud)

它将以相反的顺序返回结果.

有人能告诉我这是怎么发生的吗?

Kom*_*mpi 5

在表上指定ORDER BY只是帮助引擎以相同的顺序加速查询.它不会强制mysql始终以相同的顺序返回结果.

在此描述:http://dev.mysql.com/doc/refman/5.1/en/alter-table.html

"ORDER BY允许您按特定顺序创建包含行的新表.请注意,在插入和删除后,表格不会按此顺序保留.此选项主要用于您知道主要用于查询行中的行时大部分时间都是某个顺序.通过在对表进行重大更改后使用此选项,您可能可以获得更高的性能.在某些情况下,如果表按顺序排列,则可能使MySQL更容易排序我想稍后再订购."

因此,您也必须在查询中使用ORDER BY表达式.