0

OPTIMIZE TABLE私は断片化を修正するという印象を受けました。だから、もし私がする前に

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

ディスク上のレコードの順序を取得します。最適化を行った後、このクエリを再度実行すると、結果は PK によって順序付けられます。
私は自分のテーブルで試してみましたが、何も変わっていません.レコードの任意の順序を取得しています.

すべてのテーブルを 1 つのファイルに保存しています。私はInnoDBを使用しています。MySQL 5.5 何か不足していますか? 別の方法で PK を定義する必要がありますか?

4

1 に答える 1

1

order byステートメントがなければ、注文が保証されることはありません。

あなたの仮定

select * from t (no order by, no nothing) を実行する前に、ディスク上のレコードの順序を取得します。

間違っています。

データベースがどのようにレコードを取得して画面に表示するかを決定する方法 (またはそれらを表示しているものは何でも) は、データベースの内部実装に完全に依存します。過去にはこれはディスクの順序であった可能性がありますが、知る唯一の方法は、データベース (あなたの場合は MYSQL) がドキュメントでそれについて言及しているかどうかを確認することです。

しかし、人々はこの順序付けに依存し、過去のものを壊すことなくレコード検索アルゴリズムを改善することができなかったので、そうするだろうとは思えません。

編集:

テーブルの最適化に関しては、探しているクエリ結果を反映するインデックスを使用してみてください。

編集2:

別の考えは、あなたが今説明した状況は古典的なキャッシングの問題であるということです. データベースには既に結果セットが元の奇数の順序でどこかに格納されているため、キャッシュされたデータ セットがキャッシュされなくなるまで、最適化によって並べ替えは表示されません。キャッシュをフラッシュする方法は、私の知識を少し超えています。

于 2013-11-05T15:45:22.857 に答える