Mysql join不使用索引

Mysql 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

运行此查询大约需要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.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,你还需要知道什么吗?