查询

时间:2017-01-10 21:32:54

标签: mysql

我正在尝试优化此查询:

select id, entity_type
from tv_classified
where entity_type != 2
    and state = 0
    and dateExpiration < now();

54630 rows in set (1 min 0.42 sec)

所以我在这些列上添加了一个索引:

CREATE INDEX full_expiration_idx ON tv_classified (entity_type, state, dateExpiration)

问题是我的查询仍在同一时间,并忽略索引:

explain select id, entity_type from tv_classified where entity_type != 2 and state = 0 and dateExpiration < now();
+----+-------------+---------------+------+------------------------------------------------------------------+-----------+---------+-------+---------+-------------+
| id | select_type | table         | type | possible_keys                                                    | key       | key_len | ref   | rows    | Extra       |
+----+-------------+---------------+------+------------------------------------------------------------------+-----------+---------+-------+---------+-------------+
|  1 | SIMPLE      | tv_classified | ref  | dateExpiration_idx,entity_type_idx,state_idx,full_expiration_idx | state_idx | 2       | const | 1483498 | Using where |
+----+-------------+---------------+------+------------------------------------------------------------------+-----------+---------+-------+---------+-------------+

似乎Mysql不使用这个索引,而是喜欢在&#34; state&#34;上使用索引。而是改为。

我知道我可以在查询中使用use index(full_expiration_idx)(它可以快速运行1分钟 - > 0.5秒)但我想了解为什么Mysql不会单独使用他。

此致

1 个答案:

答案 0 :(得分:0)

您已创建了一个复合键,可用于连接条件,其中3列与另一个表的3列连接。由于您在此处使用过滤条件,因此为3列创建3个单独的索引。