0

このクエリ(MicroStrategyによって生成された)でインデックスを機能させるのに問題があります:

SELECT     a11.method  method, sum(a11.call_count) CALLCOUNT
FROM    call_facts     a11
  JOIN    dimension a12 ON (a11.user_id = a12.user_id)
  JOIN service a13 ON (a11.service_id = a13.service_id)
WHERE   (a12.is_fraudulent = 0
  AND a12.is_test_account = 0
  AND a13.in_directory in ('yes')
  AND a11.date > '2011-10-01')
GROUP BY a11.method;  

現在、a12.is_fraudulentとa12.is_test_accountにインデックスがあります。Explainは、これら2つを使用したインデックスマージを示しています。a11とa13はどちらもインデックスに適しています。このクエリを少し高速化するために、どのインデックスを作成できますか?

参考までに、a12には約800万のエントリがあり、そのうち7.4がis_test_account = 0 and is_fraudulent = 0ケースに一致します。

4

1 に答える 1

0

複合インデックスは通常、インデックスマージ最適化で組み合わされた複数の単一列インデックスよりも優れたパフォーマンスを提供します。

クエリのヘルプを求めるときに、クエリの現在のEXPLAINレポートを含めると便利です。

また、各テーブルの完全なDDL( SHOW CREATE TABLE )を投稿すると便利です。「a11とa13はどちらもインデックスに適している」というのはおそらく真実ではなく、これらのテーブルで定義したインデックスに関する情報がないためです。

推測する必要がある場合は、次のことを試してみます。

ALTER TABLE call_facts ADD INDEX (method, date, call_count);

ALTER TABLE dimension ADD INDEX (user_id, is_fraudulent, is_test_account);

ALTER TABLE service ADD INDEX (service_id, in_directory);
于 2014-10-02T17:46:56.617 に答える