我正在尝试优化此查询:
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不会单独使用他。
此致
答案 0 :(得分:0)
您已创建了一个复合键,可用于连接条件,其中3列与另一个表的3列连接。由于您在此处使用过滤条件,因此为3列创建3个单独的索引。