次の作成で大きな(1億行以上)テーブルを使用します。
data_values | CREATE TABLE `data_values` (
`T` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
`ID` varchar(32) NOT NULL,
`VAL` float DEFAULT NULL,
PRIMARY KEY (`T`,`ID`),
KEY `IX_d` (`ID`),
KEY `IX_T` (`T`)
) ENGINE=InnoDB DEFAULT CHARSET=greek PACK_KEYS=1 ROW_FORMAT=DYNAMIC |
私のクエリは次の形式です。
select t,id,val from data_values where t between "2013-01-11 02:47:02" and "2013-01-12 04:59:02" and id="815";
私の問題は、インデックスが使用される場合があり (答えがかなり早く返ってくる)、使用されない場合もあり (答えが 1 ~ 2 分で返ってくる)、その背後にあるロジックが見つからないことです。たとえば、次のクエリは高速です。
select t,id,val from data_values where t between "2013-01-11 02:47:02" and "2013-01-13 04:59:02" and id="815";
一方、次のクエリ (2 日ではなく 1 日で、より少ないデータを要求する) は低速です。
select t,id,val from data_values where t between "2013-01-11 02:47:02" and "2013-01-12 04:59:02" and id="815";
クエリの説明:
explain select t,id,value from data_values where t between "2013-01-11 02:47:02" and "2013-01-13 04:59:02" and id="815";
| id | select_type | table | type | possible_keys
| key | key_len | ref | rows | Extra
|
+----+-------------+----------------------+-------------+-----------------------
+-----------------+---------+------+------+-------------------------------------
----------+
| 1 | SIMPLE | data_values | index_merge | PRIMARY,IX_D,IX_T
| IX_D,PRIMARY | 34,38 | NULL | 1033 | Using intersect(IX_D,PRIMARY); Us
ing where |
+----+-------------+----------------------+-------------+-----------------------
+-----------------+---------+------+------+-------------------------------------
explain select t,id,val from data_values where t between "2013-01-11 02:47:02" and "2013-01-12 04:59:02" and id="815";
+----+-------------+----------------------+------+-----------------------+------
---+---------+-------+--------+-------------+
| id | select_type | table | type | possible_keys | key
| key_len | ref | rows | Extra |
+----+-------------+----------------------+------+-----------------------+------
---+---------+-------+--------+-------------+
| 1 | SIMPLE | data_values | ref | PRIMARY,IX_D,IX_T | IX_D | 34 | const | 143900 | Using where |
+----+-------------+----------------------+------+-----------------------+------
---+---------+-------+--------+-------------+
「より広い」(より多くのデータを要求する)最初のクエリがどのようにインデックスを使用し、2番目のクエリが使用しないのか理解できません。stackoverflow を検索すると、複数列のインデックスに関するいくつかの回答が見つかりました。しかし、私はすでに1つ(私の主キー)を正しい順序で使用しています(クエリでは、IDの前にt変数が記載されています)。私が見つけた別の答えは、OR を使用したクエリ (個別のクエリを実行して UNION を形成する) に関するものですが、私のクエリは AND を使用しています。
クエリを高速化する方法についてアドバイスが必要です。
どうもありがとう。