我有这张桌子:
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 :(得分:2)
我没有太多使用MySQL,但在PostgreSQL中,如果表中的记录数量很少,它可以决定不使用索引。这不是问题,因为它为情况选择了最佳查询计划。当记录数量较大时,它将使用索引。也许这与MySQL的情况相同。
编辑:您确定外键已编入索引吗?
答案 1 :(得分:0)
可能是因为您没有足够的样本数据,或者siteid值的基数(多样性)不是很大。这些是优化程序只是为了读取所有值而更快找到它的最常见原因。