1

我有一个包含数百万行的表,其中有 2DATE列用于指定开始和结束日期范围。我对两列都有一个索引,但它没有被使用,并且查询需要 10 秒才能运行,这是完全不可接受的。我的查询很简单:

SELECT * FROM `events` WHERE `valid_from` <= "2013-05-05" AND `valid_to` >= "2013-05-05"

为什么这不使用索引并且需要这么长时间才能运行?

编辑

对于EXPLAIN上面的查询:

+----------------------------------------------------------------------------------------------------+
| id | select_type   | table  | type | possible_keys | key  | key_len | ref  | rows     | Extra      |
+----------------------------------------------------------------------------------------------------+
| 1  | SIMPLE        | events | ALL  | valid_from_to | NULL | NULL    | NULL |  2166894 | Using where|
+----------------------------------------------------------------------------------------------------+
4

2 回答 2

0

检查索引和查询中的字段顺序。还有,显示

 EXPLAIN SELECT * FROM `events` WHERE `valid_from` <= "2013-05-05" AND `valid_to` >= "2013-05-05"

尝试使用索引提示

SELECT * FROM `events` USE INDEX (`valid_from_to`)
WHERE `valid_from` <= "2013-05-05" AND `valid_to` >= "2013-05-05"

或者为每个字段创建两个索引而不是一个。

于 2013-05-06T05:11:47.197 回答
0

请试试这个,nathanjosiah:

SELECT * 
FROM `events` FORCE INDEX (valid_from_to)
WHERE `valid_from` <= "2013-05-05" AND `valid_to` >= "2013-05-05"

FORCE INDEX 应该可以解决您的问题。;-)

于 2013-05-06T05:43:50.767 回答