MySQL中的默认排序顺序(ALTER TABLE ... ORDER BY ...;)

时间:2009-04-07 13:33:10

标签: mysql sorting alter-table

假设执行以下命令改变了MySQL表(ISAM)的默认顺序:

ALTER TABLE tablename ORDER BY columnname ASC;

从现在开始,我保证以“columnname ASC”的顺序获取从表中检索到的记录,假设我的查询中没有指定“ORDER BY”(即“SELECT * FROM tablename”在哪里......限制10;“)?

我应该注意哪些角落?

更新#1:非常感谢Quassnoi,他正确地指出INSERT和DELETE会扰乱排序。这引出了以下额外问题:

  • UPDATEs怎么样?假设没有对表进行INSERT或DELETE,只进行更新 - 排序顺序是否完整?
  • 假设INSERT和DELETE都是 - 我如何再次“重建”排序,比如说每天一次(在这种特殊情况下,表每天只会更改,因此在更改完成后每天重建它应该仍然可以! )。 REPAIR TABLE是否修复它,或者必须再次添加ALTER TABLE ... ORDER BY?

2 个答案:

答案 0 :(得分:24)

来自documentation

  

请注意,插入和删除后表格不会按此顺序保留

实际上,如果您向此表发出SELECT ... ORDER BYALTER TABLE选项将不会让您免除filesort,而是让filesort更快。

对已经排序的集进行排序相当于浏览此集以确保一切正常。

  

UPDATEs怎么样?假设没有对表进行INSERT或DELETE,只进行更新 - 排序顺序是否完整?

如果您的表格不包含任何动态字段(例如VARCHAR或'BLOB'),那么很可能 MyISAM在更新时不会移动它。

我不会依赖这种行为,但是,如果我正在建造一座核电站或者我得到报酬的话。

  

假设INSERT和DELETE已经完成 - 我如何再次“重建”排序,比如说每天一次(在这种特定情况下,表每天只会更改,因此在更改完成后每天重建它应该仍然可以! )。 REPAIR TABLE是否修复它,或者必须再次添加ALTER TABLE ... ORDER BY?

您需要ALTER TABLE ... ORDER BY

REPAIR只修复损坏表的物理结构。

答案 1 :(得分:3)

物理排序列可以节省IO负载。 这是在高级系统中用于加速查询时间的完全合法的方法。 您只需要不时地重新生成数据,以便它保持聚类状态。 仅仅因为有些人没有听说过它并不意味着它不存在。 - 25年高级数据库设计资深人士。