我有一个名为“date”的列表。
该表看起来像这样
CREATE TABLE IF NOT EXISTS `offers_log_archive` (
...
`date` date DEFAULT NULL,
...
KEY `date` (`date`)
) ENGINE=InnoDB
我在此表上执行以下查询:
SELECT
*
FROM
offers_log_archive as ola
WHERE
ola.date >= "2012-12-01" and
ola.date <= "2012-12-31"
然后我做了以下事情:
explain (SELECT
*
FROM
offers_log_archive as ola
WHERE
ola.date >= "2012-12-01" and
ola.date <= "2012-12-31" );
此解释的结果是
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE ola ALL date NULL NULL NULL 6206460 Using where
为什么我要输入ALL?据我所知,这基本上意味着查询将检查表中的每一行并忽略日期索引。虽然我希望mysql会使用它。
这里发生了什么以及为什么忽略了日期索引?
答案 0 :(得分:1)
您列中的几乎所有值都在查询的范围内,因此不仅索引会无用(它会增加很少的值),但它实际上会更昂贵使用索引比进行简单的表扫描。
首先尝试在桌面上运行ANALYZE
:
ANALYZE TABLE MYTABLE
如果这没有帮助,请尝试更改语法以使用BETWEEN
:
WHERE ola.date BETWEEN '2012-12-01' AND '2012-12-31'