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 に答える