18

假设 MySQL 表 (ISAM) 的默认排序通过执行以下命令进行更改:

ALTER TABLE tablename ORDER BY columnname ASC;

从现在开始,假设我的查询中没有指定“ORDER BY”(即“SELECT * FROM tablename WHERE ... LIMIT 10;”),我是否保证按照“columnname ASC”的顺序从表中检索到记录?

是否有任何我应该注意的极端情况?

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

  • 更新呢?假设没有对表进行 INSERT 或 DELETE,而只是更新 - 排序顺序会保持不变吗?
  • 假设进行了 INSERT 和 DELETE - 我如何再次“重建”排序,比如每天一次(在这种特定情况下,表仅每天更改,因此在更改完成后每天重建它应该仍然可以!)。REPAIR TABLE 是否修复它,或者必须再次添加 ALTER TABLE ... ORDER BY ?
4

2 回答 2

25

文档

注意插入和删除后表不保持这个顺序

实际上,如果你SELECT ... ORDER BY向这张桌子发出,选项ALTER TABLE不会让你省去filesort,而是让filesort速度更快。

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

更新呢?假设没有对表进行 INSERT 或 DELETE,而只是更新 - 排序顺序会保持不变吗?

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

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

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

你需要做ALTER TABLE ... ORDER BY

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

于 2009-04-07T13:37:13.277 回答
6

对列进行物理排序可以节省大量 IO。这是在高级系统中用于加快查询时间的完全合法的方法。您只需要不时重组数据,使其保持集群状态。仅仅因为有些人没有听说过它并不意味着它不存在。- 25 年高级 DB 设计老手。

于 2016-01-08T10:02:17.840 回答