0

これは私のテーブル構造です(約100万レコード):

索引表

特定の日付でいくつかのインデックスを選択する必要がありますが、関連するのは年と月だけです。

SELECT `index_name`,`results` FROM `mst_ind` WHERE 
((`index_name`='MSCI EAFE Mid NR USD' AND MONTH(`date`) = 3 AND YEAR(`date`) = 2003) OR
(`index_name`='MSCI Morocco PR USD' AND MONTH(`date`) = 3 AND YEAR(`date`) = 2003))
AND `time_period`='M1'

問題なく動作しますが、パフォーマンスはひどいものです。プロファイラーを使用してクエリを実行しましたが、可能なキーを提案できませんでした。

主キーには、index_id、date、および time_period が含まれます。

このクエリを最適化/改善するにはどうすればよいですか?

ありがとう!

更新: 説明レポート: ここに画像の説明を入力

4

1 に答える 1

0

MONTHやなどの関数を使用してインデックスが作成されるフィールドに変換を適用しているため、おそらくインデックスの使用を無効にしていますYEAR。あなたは出来る:

  • 次のようにand関数をWHERE使用しないように、句を別の方法で記述します。MONTHYEAR

    date>= '2003-03-01' およびdate< '2003-04-01'

編集:おそらくこのテーブルにはインデックスがないことに気付きました。index_namedateおよびtime_periodフィールドにインデックスを追加することを検討してください。

于 2013-11-08T06:08:49.747 に答える