0

テーブルには2つの列があります。

CREATE TABLE items ( 
    k INT auto_increment PRIMARY KEY, 
    val INT UNSIGNED
) ENGINE=MyISAM;

私はテーブルに4つのアイテムを置きました:

INSERT INTO items (val) VALUES (12),(23),(45),(56);

今私がする場合:

EXPLAIN SELECT * FROM items ORDER BY k;

私は恐ろしい「ファイルソートを使用して」取得します。どうしたの?このページによると、注文にはインデックスを使用する必要があります。私は何か間違ったことをしていますか?

XPではMySQL5.0.41で、ubuntuでは5.0.67でテストされています。

更新:テーブルに1,110,000行を追加し、VARCHAR列を追加してテキストで埋めました。テーブルサイズは135MBになりましたが、まだ「ファイルソートを使用」しています。

  1. たくさんの行をすばやく追加する方法について、誰かがヒントを持っていますか?
  2. クエリ最適化テストに「十分な大きさ」のテーブルをどの時点で検討する必要がありますか?
4

2 に答える 2

3

たぶん、たぶん、テーブル全体が1つのブロックに収まり、インデックスをわざわざ読み取らないことを理解するのに十分賢いのかもしれません。テーブル全体をメモリに読み込んで並べ替える方がおそらく速いでしょう(それが必要な場合でも、ブロック内のキーですでに並べ替えられている可能性があります)。

より大きなテーブルで試してみてください。

于 2009-07-08T12:26:49.977 に答える
2

次を使用して強制できます。

EXPLAIN SELECT k, val FROM items FORCE INDEX(PRIMARY) ORDER BY k

インデックスサイズなどに関連するMyISAMの問題である可能性があると思います.

InnoDB と同じテーブルを作成し、元の順序で実行すると、PRIMARY インデックスを使用して正常に動作します。

于 2009-07-08T12:35:49.790 に答える