私はこのテーブルを持っています:
CREATE TABLE IF NOT EXISTS `test1_nopart` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`idAccount` int(10) unsigned NOT NULL,
`data` mediumint(8) unsigned NOT NULL,
`date` date NOT NULL,
PRIMARY KEY (`id`),
KEY `date` (`date`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
このテーブルに 10 000 000 行を入力します。日付による再分割は均一です
EXPLAIN SELECT * FROM `test1_nopart` WHERE date = "2014-03-04"
これが結果です
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE test1_nopart ALL NULL NULL NULL NULL 7875981 Using where
=> 説明なしで 3.6 秒 (約) 3000 行の結果
ご覧のとおり、インデックスは使用されておらず、possible_keys 列の一部ではありません!
カバリング インデックス ウェイを使用した同じリクエスト
EXPLAIN SELECT date FROM `test1_nopart` WHERE date = "2014-03-04"
結果:
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE test1_nopart index NULL date 3 NULL 7875981 Using where; Using index
=> 説明なしで 3000 行の結果に対して 2.8 秒 (約)
MySQL がこのインデックス (DATE) を適切に使用しないのはなぜですか ???
情報: - VM サーバー (私たちの開発環境、ハードウェア構成はわかりません) - MySQL 5.5.8
SHOW INDEX FROM test1_nopart
結果:
Table Non_unique Key_name Seq_in_index Column_name Collation Cardinality Sub_part Packed Null Index_type Comment Index_comment
test1_nopart 0 PRIMARY 1 id A 7875981 NULL NULL BTREE
test1_nopart 1 date 1 date A 6077 NULL NULL BTREE
- 日付 2014-03-04 => 3134 行
- 合計 (ロールアップ) => 7 875 488
- テーブルには 2556 個の異なる「日付」値があります