Mysql join不使用索引
运行此查询大约需要1sMysql join不使用索引,mysql,Mysql,运行此查询大约需要1s 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') 表1约有500K行,表2约有250K行。table1.i
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')
表1约有500K行,表2约有250K行。table1.id、table1.value和table2.id都是单独的索引。两个id列都是UINT,值为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选择\u类型表类型可能的\u键\u长度参考行额外
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列上的索引进行连接来优化第一个查询?您的第二个查询没有意义。您的意思是:从table2中选择table2.name,其中id在select id from table1中,table1.value='PCF973F00'如果您希望我们帮助优化查询,您需要向我们显示表和索引定义,以及每个表的行数。也许您的表定义不好。可能索引没有正确创建。也许你在你认为你有的专栏上没有索引。如果看不到表和索引定义,我们无法判断。我们还需要行计数,因为这会极大地影响查询优化。如果你知道如何进行解释或获得执行计划,也可以将结果放在问题中。如果您没有索引,请尽快访问。@Ray您完全正确,它应该是IN,我认为它恰好可以正常工作,因为子查询只返回一行,在任何情况下,我都会得到相同的结果IN@AndyLester我认为包含每个表中的行数和相关的索引列类型就足够了,我做到了。桌子是InnoDB,你还需要知道什么吗?