web-dev-qa-db-ja.com

MySQLのデフォルトのソート順(ALTER TABLE ... ORDER BY ...;)

MySQLテーブル(ISAM)のデフォルトの順序は、以下を実行することによって変更されると想定します。

ALTER TABLE tablename ORDER BY columnname ASC;

これから、私は 保証付き クエリで「ORDERBY」が指定されていないと仮定して、「columnname ASC」の順序でテーブルから取得されたレコードを取得するには(つまり、「SELECT * FROM tablename WHERE ... LIMIT 10;」)?

知っておくべきコーナーケースはありますか?

更新#1: INSERTとDELETEが順序を台無しにすることを正しく指摘してくれたQuassnoiに感謝します。これにより、次の追加の質問が発生します。

  • UPDATEはどうですか?テーブルに対してINSERTまたはDELETEが行われず、更新のみが行われると想定します-ソート順はそのままですか?
  • INSERTとDELETEが行われたと仮定します。たとえば、1日に1回、並べ替えを再度「再構築」するにはどうすればよいですか(この特定のケースでは、テーブルは毎日しか変更されないため、変更が行われた後に毎日再構築しても問題ありません!)。 REPAIR TABLEはそれを修正しますか、それともdo ALTER TABLE ... ORDER BYを再度追加する必要がありますか?
17
knorv

ドキュメント から:

挿入および削除後、テーブルはこの順序のままではないことに注意してください

実際、このテーブルにSELECT ... ORDER BYを発行した場合、ALTER TABLEのオプションはfilesortを惜しまないが、代わりにfilesortをはるかに高速にする。

すでに注文されたセットを並べ替えることは、このセットを参照してすべてが正常であることを確認することと同じです。

UPDATEはどうですか?テーブルに対してINSERTまたはDELETEが行われず、更新のみが行われると想定します-ソート順はそのままですか?

テーブルに動的フィールド(VARCHARや 'BLOB'など)が含まれていない場合、おそらくMyISAMは更新時にテーブルを移動しません。

しかし、私が原子力発電所や私がお金を払っている何かを建設しているなら、私はこの行動に頼りません。

INSERTとDELETEが行われたと仮定します。たとえば、1日に1回、並べ替えを再度「再構築」するにはどうすればよいですか(この特定のケースでは、テーブルは毎日しか変更されないため、変更が行われた後に毎日再構築しても問題ありません!)。 REPAIR TABLEはそれを修正しますか、それともdo ALTER TABLE ... ORDER BYを再度追加する必要がありますか?

ALTER TABLE ... ORDER BYを実行する必要があります。

REPAIRは、破損したテーブルの物理構造を修正するだけです。

24
Quassnoi

列を物理的に注文すると、IOの負荷を節約できます。これは、クエリ時間を短縮するために高度なシステムで使用される完全に正当な方法です。時々データを再編成する必要があるので、データはクラスター化されたままになります。一部の人々がそれを聞いたことがないからといって、それが存在しないという意味ではありません。 -25年の高度なDB設計のベテラン。

4
carlo