此查询大约需要1秒才能运行
select table2.name from table1 join table2 on table1.id = table2.id and table1.value='PCF973F00'
虽然这个需要大约80毫秒
select table2.name from table2 where id = (select id from table1 where table1.value = 'PCF973F00')
table1
有大约500K行,table2
大约有250K。 table1.id
,table1.value
和table2.id
都是单独的索引。两个id
列都是uint,value
是varchar 50.
两个查询的解释是
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE table1 ref value,id value 52 const 1 Using where
1 SIMPLE table2 ALL id NULL NULL NULL 240858 Using where; Using join buffer
和 id select_type表类型possible_keys键key_len ref rows Extra
1 PRIMARY table2 ref id id 4 const 1 Using where
2 SUBQUERY table1 ref value value 52 NULL 1 Using where
表格定义:
CREATE TABLE `table1` (
`id` int(10) unsigned NOT NULL,
`source_id` mediumint(7) unsigned NOT NULL,
`type` varchar(20) NOT NULL,
`value` varchar(50) NOT NULL,
KEY `value` (`value`),
KEY `id` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
CREATE TABLE `table2` (
`id` int(10) unsigned NOT NULL,
`name` varchar(50) NOT NULL,
KEY `name` (`name`),
KEY `id` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
所以我的问题是,为什么MySQL不使用table1.value
上的索引优化第一个查询,然后通过两个表'id
列上的索引加入?