【发布时间】:2011-12-13 11:40:27
【问题描述】:
可能重复:
Default sort-ordering in 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;
我有一张表,我更改了默认排序,例如:
ALTER TABLE test_table ORDER BY sort_order ASC;
此表永远不会更新,并且在其生命周期内不会删除或添加任何记录。这一切似乎都有效,所以如果我使用以下查询:
SELECT * FROM test_table LIMIT 10
它以正确的顺序返回 10 条记录。
即使我使用:
SELECT * FROM test_table WHERE num=3
它以正确的顺序返回结果。
如果我这样做了
SELECT * FROM test_table WHERE country='AX'
它将以相反的顺序返回结果。
谁能告诉我这是怎么发生的?
【问题讨论】:
-
country已编入索引,可能country索引与sort_order的顺序不同,或者根本没有排序。或者在你的情况下,它是意外倒序的...... -
ORDER BY 对于包含用户定义的聚集索引(PRIMARY KEY 或 NOT NULL UNIQUE 索引)的 InnoDB 表没有意义。如果存在这样的索引,InnoDB 总是根据这样的索引对表行进行排序。 - dev.mysql.com/doc/refman/5.1/en/alter-table.html - 我知道你的表引擎是 MEMORY,但我认为情况是一样的。
-
这似乎类似于:stackoverflow.com/questions/725717/….. 文档除外:请注意,插入和删除后表不会保持此顺序。此选项主要在您知道大部分时间以特定顺序查询行时很有用。通过在对表进行重大更改后使用此选项,您可能可以获得更高的性能。在某些情况下,如果表按您以后要排序的列排序,则可能会使 MySQL 更容易排序...可能,可能...不要依赖
标签: mysql