我的印象是OPTIMIZE TABLE
修复碎片。所以,如果在我之前
select * from t -- (no order by, no nothing)
我会得到磁盘上记录的顺序。在进行优化并再次运行此查询后,结果将按 PK 排序。
我只是在我的一张桌子上试了一下,没有任何改变,我仍然得到任意顺序的记录。
我将所有表格存储在一个文件中。我正在使用 InnoDB。MySQL 5.5 我错过了什么,我应该以其他方式定义 PK 吗?
我的印象是OPTIMIZE TABLE
修复碎片。所以,如果在我之前
select * from t -- (no order by, no nothing)
我会得到磁盘上记录的顺序。在进行优化并再次运行此查询后,结果将按 PK 排序。
我只是在我的一张桌子上试了一下,没有任何改变,我仍然得到任意顺序的记录。
我将所有表格存储在一个文件中。我正在使用 InnoDB。MySQL 5.5 我错过了什么,我应该以其他方式定义 PK 吗?
如果没有order by
声明,您将永远无法保证订单。
你的假设
如果之前我会从 t 中选择 *(没有排序,没有任何内容)我会得到磁盘上记录的顺序
错了。
数据库如何决定检索记录并将它们显示在屏幕上(或您正在查看的任何内容)完全取决于数据库的内部实现。在过去,这可能是磁盘顺序,但唯一知道的方法是检查数据库(在您的情况下为 MYSQL)是否在其文档中提及任何有关它的内容。
我怀疑他们会这样做,因为那时人们将依赖这种排序,并且他们无法在不破坏过去的情况下改进他们的记录检索算法。
至于优化表,请尝试使用反映您正在寻找的查询结果的索引。
另一个想法是你刚才描述的情况是一个典型的缓存问题。因为数据库已经将结果集存储在原始奇数排序的某个位置,所以在不再缓存缓存的数据集之前,您的优化不会显示重新排序。你如何刷新缓存有点超出我的知识。