我需要一些幫助來解決這個問題。我試圖讓Mysql在DATETIME字段上使用索引。當表有其他字段時,Mysql不使用DATETIME索引
如果表中有其他(未使用的)字段,Mysql決定不使用索引。考慮兩種情況如下:
有2場的簡單表工作正常:
DROP TABLE IF EXISTS datetime_index_test;
CREATE TABLE datetime_index_test (
id INT UNSIGNED NOT NULL AUTO_INCREMENT ,
created DATETIME NOT NULL ,
PRIMARY KEY (id) ,
INDEX (created)
) ENGINE = InnoDB ;
INSERT INTO datetime_index_test (created) VALUES
('2011-04-06 00:00:00'),
('2011-04-06 01:00:00'),
('2011-04-06 02:00:00'),
('2011-04-06 03:00:00'),
('2011-04-06 04:00:00'),
('2011-04-06 05:00:00'),
('2011-04-06 06:00:00'),
('2011-04-06 00:00:00');
EXPLAIN SELECT * FROM datetime_index_test
WHERE created <= '2011-04-06 04:00:00';
+----+-------------+---------------------+-------+---------------+---------+---------+------+------+--------------------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+---------------------+-------+---------------+---------+---------+------+------+--------------------------+
| 1 | SIMPLE | datetime_index_test | range | created | created | 4 | NULL | 4 | Using where; Using index |
+----+-------------+---------------------+-------+---------------+---------+---------+------+------+--------------------------+
3場一個簡單的表,不正常工作:
DROP TABLE IF EXISTS datetime_index_test;
CREATE TABLE datetime_index_test (
id INT UNSIGNED NOT NULL AUTO_INCREMENT ,
created DATETIME NOT NULL ,
user int(10) unsigned DEFAULT 0,
PRIMARY KEY (id) ,
INDEX (created)
) ENGINE = InnoDB ;
INSERT INTO datetime_index_test (created) VALUES
('2011-04-06 00:00:00'),
('2011-04-06 01:00:00'),
('2011-04-06 02:00:00'),
('2011-04-06 03:00:00'),
('2011-04-06 04:00:00'),
('2011-04-06 05:00:00'),
('2011-04-06 06:00:00'),
('2011-04-06 00:00:00');
EXPLAIN SELECT * FROM datetime_index_test
WHERE created <= '2011-04-06 04:00:00';
+----+-------------+---------------------+------+---------------+------+---------+------+------+-------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+---------------------+------+---------------+------+---------+------+------+-------------+
| 1 | SIMPLE | datetime_index_test | ALL | created | NULL | NULL | NULL | 8 | Using where |
+----+-------------+---------------------+------+---------------+------+---------+------+------+-------------+
最後, 我的問題; 任何人都可以向我解釋爲什麼Mysql決定不使用索引?
掃描僅包含10條左右記錄的索引是浪費時間,因爲全表掃描需要大約相同的時間,所以mysql只適用於全表掃描。嘗試添加幾千條記錄,看看事情是否改變。 – 2011-04-06 15:37:09
@Mark謝謝你的建議。我嘗試添加20000條記錄並做了ANALYZE TABLE。 EXPLAIN仍然給了我相同的結果,並且搜索了20008行(選擇類型仍然是ALL)。 – Joernsn 2011-04-07 06:28:30