2

次のように作成された、2 つのフィールドを持つ単純なキー値テーブルがあります。

 CREATE TABLE `mytable` (
    `key` varchar(255) NOT NULL,
    `value` double NOT NULL,
    KEY `MYKEY` (`key`)
 );

キーは一意ではありません。テーブルには 100 万を超えるレコードが含まれています。特定のキーのすべての値を合計し、上位 10 個のキーを返すクエリが必要です。これが私の試みです:

  SELECT t.key, SUM(t.value) value
  FROM mytable t
  GROUP BY t.key
  ORDER BY value DESC
  LIMIT 0, 10;

しかし、これは非常に遅いです。GROUP BY と SUM がなければ非常に高速ですが、ORDER BY がなければ非常に高速ですが、何らかの理由で 2 つの組み合わせが非常に遅くなります。なぜそうなるのか、またどのようにスピードアップできるのか、誰か説明できますか?


価値の指標はありません。作成してみましたが、役に立ちませんでした。


EXPLAIN EXTENDED は Workbench で以下を生成します。

 id select_type table type  possible_keys key   key_len ref  rows    filtered Extra 
 1  SIMPLE      t     index NULL          MYKEY 257     NULL 1340532 100.00   "Using temporary; Using filesort" 

テーブルには約 400K の一意のキーがあります。


クエリの実行には 3 分以上かかります。3分で止めたのでどのくらいかわかりません。ただし、キーのインデックスを削除すると、30 秒で実行されます。誰でも理由がわかりますか?

4

1 に答える 1

2

私が見る限り、これを本当に高速化する唯一の方法は、一意のキーを持つ別のテーブルを作成し、合計値を維持することです。次に、値にインデックスを付けてトップ 10 をすばやく取得できます。また、計算は既に完了しています。テーブルがあまり多くの場所で更新されない限り、これは大きな問題にはなりません。

このタイプのクエリの主な問題は、group byではある順序でインデックスを作成する必要があり、order byでは別の順序で並べ替える必要があることです。

于 2013-03-20T16:37:48.633 に答える