合計400万行のテーブルがあります。私は次のクエリを実行するとインデックス付きカラムを使用した苦しいMySQLクエリ
、それは
SELECT * FROM `traffic`
WHERE `callstart_timestamp` >= '2016-09-01 00:00:00'
AND `callend_timestamp` <= '2016-09-18 00:00:00'
AND app = 'XXXX'
416040合計を完了するために40秒かかり、クエリは、40.0631秒かかりました。
条件からAND app = 'XXXX'
を削除すると、1秒未満で終了します。
すべての列のインデックスが作成されているため、この問題を引き起こしている可能性のあることについてアドバイスできますか?
クエリは、EXPLAIN:
SIMPLE; traffic; NULL; ref; app,callend_timestamp,callstart_timestamp; app; 22; const; 1976467; 12.13; Using where;
は、CREATE:
CREATE TABLE `traffic` (
`id` varchar(20) NOT NULL,
`user_cli` varchar(15) NOT NULL,
`ddi` varchar(15) DEFAULT NULL,
`callstart_timestamp` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
`callend_timestamp` timestamp NULL DEFAULT NULL,
`app` varchar(20) NOT NULL,
`lang` char(2) NOT NULL DEFAULT 'en'
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
ALTER TABLE `traffic`
ADD PRIMARY KEY (`id`),
ADD KEY `app` (`app`),
ADD KEY `callend_timestamp` (`callend_timestamp`),
ADD KEY `callstart_timestamp` (`callstart_timestamp`),
ADD KEY `ddi` (`ddi`);
UPDATE:
私は以下の回答の一部を実装していると、彼らは多くを助けました!私はどの答えが私の場合より優れているか把握しようとします。結果を更新します。代わりに、実行計画をオプティマイザを混同して、それぞれに別々のインデックスのすべての3列に対して1つのインデックスを追加
「アプリ」のインデックスの使用を無効にするとどうなりますか?つまり、「アプリ」ではなく日付をオフにします。 –
ちょっとした提案:別のテーブルに移動し、外部キーで参照してください。次に、アプリの主キーでフィルタリングします。特に、多くの行で同じアプリのvarcharを使用すると便利です。 – drodil