0

我的印象是OPTIMIZE TABLE修复碎片。所以,如果在我之前

select * from t -- (no order by, no nothing) 

我会得到磁盘上记录的顺序。在进行优化并再次运行此查询后,结果将按 PK 排序。
我只是在我的一张桌子上试了一下,没有任何改变,我仍然得到任意顺序的记录。

我将所有表格存储在一个文件中。我正在使用 InnoDB。MySQL 5.5 我错过了什么,我应该以其他方式定义 PK 吗?

4

1 回答 1

1

如果没有order by声明,您将永远无法保证订单。

你的假设

如果之前我会从 t 中选择 *(没有排序,没有任何内容)我会得到磁盘上记录的顺序

数据库如何决定检索记录并将它们显示在屏幕上(或您正在查看的任何内容)完全取决于数据库的内部实现。在过去,这可能是磁盘顺序,但唯一知道的方法是检查数据库(在您的情况下为 MYSQL)是否在其文档中提及任何有关它的内容。

我怀疑他们会这样做,因为那时人们将依赖这种排序,并且他们无法在不破坏过去的情况下改进他们的记录检索算法。

编辑:

至于优化表,请尝试使用反映您正在寻找的查询结果的索引。

编辑2:

另一个想法是你刚才描述的情况是一个典型的缓存问题。因为数据库已经将结果集存储在原始奇数排序的某个位置,所以在不再缓存缓存的数据集之前,您的优化不会显示重新排序。你如何刷新缓存有点超出我的知识。

于 2013-11-05T15:45:22.857 回答