私は2200万のレコードを持つ大きなテーブルを持っています。次のクエリを実行したい:
select auto_alerts from alerts_stat where endDate > "2012-12-01"
パフォーマンスを向上させるために、endDataフィールドにBTREEインデックスを追加しました。
CREATE INDEX endDate_index USING BTREE ON alerts_stat(endDate)
クエリ実行プランの分析を開始した後:
今から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'
間隔を1日増やすと、次のようになります。
explain select alerts_sp from alerts_stat
where endDate between CURDATE() - 15 and CURDATE() - 6;
EXPLAINによると、MySQLは22,923,126行すべてを処理する予定です。
'1', 'SIMPLE', 'browser_plugin_alerts_stat', 'ALL', 'endDate_index', NULL, NULL, NULL, '22932390', 'Using where'
たとえば、WHEREプロセス22,925,642で条件なしで選択します。
実行計画を改善してもいいですか?たぶん私はどこかで間違いを犯しているのでしょうか、それとも通常のMySQLの振る舞いですか?