8

私は2200万レコードの大きなテーブルを持っています。 私は次のクエリを実行したい:私は、クエリの実行計画を分析するために開始した後日付によるMySQLのクエリは大きな逆数で

CREATE INDEX endDate_index USING BTREE ON alerts_stat(endDate) 

::私はENDDATAフィールドのBTREEインデックスを追加パフォーマンスを向上させるために

select auto_alerts from alerts_stat where endDate > "2012-12-01" 

私がしたいとき今まで15日から7日の間にパラメータを取得する:

explain select alerts_sp from alerts_stat 
where endDate between CURDATE() - 15 and CURDATE() - 7; 

次の実行計画で2,762,088行を処理しました。

'1', 'SIMPLE', 'browser_plugin_alerts_stat', 'range', 'endDate_index', 'endDate_index', '4', NULL, '2762088', 'Using where' 

私は一日で間隔を長くすると、私が受け取っ:

explain select alerts_sp from alerts_stat 
where endDate between CURDATE() - 15 and CURDATE() - 6; 

をEXPLAINは、MySQLの計画はすべて22923126行を処理すると述べました。

'1', 'SIMPLE', 'browser_plugin_alerts_stat', 'ALL', 'endDate_index', NULL, NULL, NULL, '22932390', 'Using where' 

たとえば、WHEREプロセス22,925,642で条件なしで選択します。

実行計画を改善してもよいですか?多分私はどこかで間違いを抱えているのでしょうか、あるいはMySQLの正常な動作ですか?

答えて

3

結果セットがすべての行の8〜9%を超えると、MySQLは全テーブルスキャンを実行します。 私には、ある日、テーブル全体のスキャン方向にスイングMySQLを追加するように見えます。 結果が優れているかどうかを確認するためにインデックスを強制的に試すことができます。

UPDATE:私は何を読んでから、

、MySQLのクエリオプティマイザは、このような境界線の場合、間違って選択する傾向があるので、簡単にインデックスを強制的に、より良い仕事ができます。それ以外の場合は、これは単純なクエリです。最適化の余地はあまりありません。

この2つの列にCovering indexを作成し、その使用を強制すると、最良の結果が得られる可能性があります。

+0

ありがとうございました。それは私の場合だと思う。したがって、MySQL固有の動作です。大きな間隔でsum( 'alerts_sp')などを取得するために、何らかの方法でクエリを改善できますか? – Taky