我已經得到了這個表:簡單的MySQL索引問題
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.6sec的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
=>而不解釋爲2.8sec的3000行(約)
爲什麼結果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年3月4日=> 3134行
- 總(彙總)=> 7 875 488
- 表中有2556個不同的'日期'值
什麼是'SHOW INDEX的輸出從test1_nopart',尤其是指數基數?另外,爲什麼將您的列命名爲MySQL的保留字? – 2011-12-29 17:19:30
哎唷,看來6077很低... – nemenems 2011-12-29 17:36:04
基數不是真正的問題。當您運行查詢'SELECT COUNT(1)datecount,'date' FROM test1_nopart GROUP BY'date' WITH ROLLUP;'你會看到真正的基數。您還會看到2014-03-14佔用了多少行。 – RolandoMySQLDBA 2011-12-29 17:40:51