【问题标题】:Default sort-ordering in MySQL (ALTER TABLE ... ORDER BY ...;)MySQL 中的默认排序顺序 (ALTER TABLE ... ORDER BY ...;)
【发布时间】:2010-10-18 01:32:45
【问题描述】:

假设 MySQL 表 (ISAM) 的默认顺序通过执行更改:

ALTER TABLE tablename ORDER BY columnname ASC;

从现在开始,我是否保证在我的查询中没有指定“ORDER BY”(即“SELECT * FROM tablename WHERE ... 限制 10;")?

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

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

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

【问题讨论】:

  • 默认排序顺序似乎是一种懒惰的尝试,最终会让您头疼不已。我根本不会碰它,只是确保在我的查询中指定 Order By。

标签: mysql sorting alter-table


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    来自documentation

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

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

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

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

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

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

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

    你需要ALTER TABLE ... ORDER BY

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

    【讨论】:

    • 非常感谢您的快速回复。我添加了两个与您的回答相关的后续问题。
    • @Quassnoi 我做了 ALTER TABLE ... ORDER BY 然后删除了一些记录,我的表没有聚集..?这是为什么呢?
    • @Quassnoi 嗯,我想也许在 5.0 上他们已经改变了这一点,你会知道的。
    • @Basit: 5.0 已退出 2006。无论如何,请将其作为一个单独的问题发布。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-04
    • 2013-12-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-24
    相关资源
    最近更新 更多