2010-04-03 67 views
0

我有這個表:MySQL不會使用索引進行查詢嗎?

CREATE TABLE `point` (                     
      `id` INT(11) NOT NULL AUTO_INCREMENT,                 
      `siteid` INT(11) NOT NULL,                   
      `lft` INT(11) DEFAULT NULL,                   
      `rgt` INT(11) DEFAULT NULL,                   
      `level` SMALLINT(6) DEFAULT NULL,                  
      PRIMARY KEY (`id`),                     
      KEY `point_siteid_site_id` (`siteid`),                
      CONSTRAINT `point_siteid_site_id` FOREIGN KEY (`siteid`) REFERENCES `site` (`id`) ON DELETE CASCADE 
     ) ENGINE=INNODB AUTO_INCREMENT=35 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci   

而這個查詢:

SELECT * FROM `point` WHERE siteid = 1; 

導致此EXPLAIN信息:

+----+-------------+-------+------+----------------------+------+---------+------+------+-------------+ 
| id | select_type | table | type | possible_keys  | key | key_len | ref | rows | Extra  | 
+----+-------------+-------+------+----------------------+------+---------+------+------+-------------+ 
| 1 | SIMPLE  | point | ALL | point_siteid_site_id | NULL | NULL | NULL | 6 | Using where | 
+----+-------------+-------+------+----------------------+------+---------+------+------+-------------+ 

的問題是,爲什麼不使用查詢point_siteid_site_id索引?

+0

我重新創建了你的表格,它清楚地使用了預期的索引。 – Nirmal 2010-04-03 15:29:21

+0

當然不適合我,那是我爲該查詢收到的確切的EXPLIAN輸出。 – 2010-04-06 21:12:13

回答

2

我還沒有使用過多的MySQL,但是在PostgreSQL中如果表中的記錄數很少,它可以決定不使用索引。這不是問題,因爲它爲情況選擇了最佳的查詢計劃。當記錄數量更大時,它將使用索引。也許這與MySQL的情況是一樣的。

編輯:你確定外鍵是索引?

+0

最近的Mysql版本會在任何定義爲外鍵的字段上自動創建鍵,而不是單獨創建它。 – 2010-04-03 17:39:42

+0

謝謝,很高興知道。 – 2010-04-03 18:34:26

0

這可能是因爲您沒有足夠的樣本數據,或者siteid值的基數(多樣性)不是很大。這些是優化器只會讀取所有值才能更快找到的最常見原因。