MySQL查询忽略where子句的索引

时间:2013-01-15 13:25:26

标签: mysql indexing explain

我有一个名为“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会使用它。

这里发生了什么以及为什么忽略了日期索引?

1 个答案:

答案 0 :(得分:1)

您列中的几乎所有值都在查询的范围内,因此不仅索引会无用(它会增加很少的值),但它实际上会更昂贵使用索引比进行简单的表扫描。

修改

首先尝试在桌面上运行ANALYZE

ANALYZE TABLE MYTABLE

如果这没有帮助,请尝试更改语法以使用BETWEEN

WHERE ola.date BETWEEN '2012-12-01' AND '2012-12-31'