假定通过执行以下操作来更改MySQL表(ISAM)的默认顺序:
ALTER TABLE tablename ORDER BY columnname ASC;
从现在开始,假设我的查询中未指定“ ORDER BY”(即“ SELECT * FROM tablename WHERE … LIMIT 10;”),我是否可以 保证 按“ columnname ASC”的顺序从表中检索到记录?
我应该注意什么极端情况吗?
更新#1:非常 感谢Quassnoi,他正确地指出INSERT和DELETE弄乱了顺序。这使我想到以下额外的问题:
从 文档 :
请注意,插入和删除后,表不会按此顺序保留
实际上,如果您SELECT ... ORDER BY向该表发出命令,则该选项ALTER TABLE不会浪费您的时间filesort,反而会使filesort速度更快。
SELECT ... ORDER BY
ALTER TABLE
filesort
对已排序的集合进行排序等同于浏览该集合以确保一切正常。
那么更新呢?假设没有对表进行INSERT或DELETE操作,而仅对更新进行了操作-排序顺序是否完整?
如果您的表不包含任何动态字段(如VARCHAR“ BLOB”或“ BLOB”),则更新时 很可能 MyISAM不会移动它。
VARCHAR
MyISAM
但是,如果我正在建造核电站或获得报酬的东西,我将不会依靠这种行为。
假设已完成INSERT和DELETE- 如何再次“重建”排序,每天说一次(在这种特定情况下,该表每天仅更改一次,因此在进行更改后每天重新生成它应该仍然可以!)。REPAIR TABLE是否可以修复它,还是必须再次添加ALTER TABLE … ORDER BY?
您需要做ALTER TABLE ... ORDER BY。
ALTER TABLE ... ORDER BY
REPAIR 只是修复损坏表的物理结构。
REPAIR