1

我有一个表,其中有一列名为“日期”。

桌子看起来像这样

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会使用它。

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

4

1 回答 1

1

列中的几乎所有值都在查询范围内,因此索引不仅几乎无用(它不会增加任何价值),而且使用索引实际上比简单的表扫描要昂贵得多.

编辑

尝试首先ANALYZE在桌子上运行:

ANALYZE TABLE MYTABLE

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

WHERE ola.date BETWEEN '2012-12-01' AND '2012-12-31'
于 2013-01-15T14:04:18.300 回答