3

次のような大きなテーブルが mysql (基本的にはログ) に保存されています。

  CREATE TABLE `log` (
    `ID_1` int(10) unsigned NOT NULL,
    `ID_2` int(10) unsigned NOT NULL,
    `DELTA` tinyint(3) unsigned NOT NULL,
    `ACTIVE` tinyint(1) NOT NULL,
    `DATA` bigint(20) unsigned NOT NULL,
  ) ENGINE=MyISAM DEFAULT CHARSET=utf8$$

索引なし。データはランダムなデータでランダムな瞬間に挿入され、正常に動作します。次に、テーブルはオフラインになります (読み取り/書き込み操作はありません)。この時点でのテーブル サイズは約 180M レコードです。ID_1、ID_2、DELTA、ACTIVE フィールド (4 つすべて、昇順) にインデックスを追加しています。かなり高速に動作します (3 ~ 4 分)。

今、テーブルからすべてのデータを ID_1、ID_2、DELTA、ACTIVE の昇順で取得しようとしています (同じフィールドで、インデックスと同じ順序で) が、選択は 'SORTING RESULT' (SHOW で) の年齢にとどまりますPROCESSLIST) 最初の行が返されるまで。インデックスを使用するように SELECT ステートメントをヒント/強制しようとしましたが (つまり、FORCE INDEX / USE INDEX)、違いはありません。この種のクエリの応答速度を上げる方法についてのヒント:

SELECT `ID_1`, `ID_2`, `DELTA`, `ACTIVE` FROM `log` ORDER BY `ID_1`, `ID_2`, `DELTA`, `ACTIVE` ASC;

?

同様の質問がここで尋ねられました:遅い ORDER BY in large table - but without answer. そのようなものを投稿するのは良い考えだと思いましたが、今では誰かが答えを知っているかもしれません.

ありがとうございました!

4

1 に答える 1

7

ORDER BYデータを効率的に並べ替えるには、句で使用するすべての列を使用して複合インデックスを追加する必要があります。ORDER BYインデックス内の列の順序は、句内の列の順序と同じでなければなりません。

あなたの場合、それは次のようになります。

ALTER TABLE `log` ADD INDEX mySortIndex(`ID_1`, `ID_2`, `DELTA`, `ACTIVE`);

MySQL がクエリをどのように実行しているかを確認するには、次を使用します。

EXPLAIN SELECT `ID_1`, `ID_2`, `DELTA`, `ACTIVE` FROM `log` ORDER BY `ID_1`, `ID_2`, `DELTA`, `ACTIVE` ASC;

出力は、どのインデックスが使用されているかを示します。

既知の数の結果行のみが必要な場合は、LIMITMySQL がテーブル全体をソートしないようにするために使用できます。

SELECT `ID_1`, `ID_2`, `DELTA`, `ACTIVE`
FROM `log` ORDER BY `ID_1`, `ID_2`, `DELTA`, `ACTIVE` ASC
LIMIT 100;
于 2012-11-15T01:32:24.640 に答える