假设执行以下命令改变了MySQL表(ISAM)的默认顺序:
ALTER TABLE tablename ORDER BY columnname ASC;
从现在开始,我保证以“columnname ASC”的顺序获取从表中检索到的记录,假设我的查询中没有指定“ORDER BY”(即“SELECT * FROM tablename”在哪里......限制10;“)?
我应该注意哪些角落?
更新#1:非常感谢Quassnoi,他正确地指出INSERT和DELETE会扰乱排序。这引出了以下额外问题:
答案 0 :(得分:24)
请注意,插入和删除后表格不会按此顺序保留
实际上,如果您向此表发出SELECT ... ORDER BY
,ALTER 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年高级数据库设计资深人士。