关于mysql Join的奇怪索引活动

时间:2013-03-13 05:42:11

标签: mysql sql phpmyadmin

我有一个countries表,结构如下,iso2列上有索引:


enter image description here


执行常规选择查询时,iso2索引正常工作:


enter image description here


但是当与iso2上的另一个表连接时,它表现得非常奇怪:


enter image description here


首先它说NULL possible_keys然后仍然使用它?然后它还说256行,这是整个表。它在大更新上运行非常慢,所以我可以告诉它没有使用索引。这有什么问题?

编辑:另外,如果我从iso2索引中取出id列(参见第一张图片),那么就会说连接上没有使用索引。


更多信息:我一直在尝试规范化我的数据并使用country_id代替country。我正在用country_id更新表格,当时我注意到它的速度非常慢。一些EXPLAIN让我发现索引没有被使用。也许它与iso2是char(2)有什么关系?

我像这样填写country_id:

UPDATE leads
LEFT JOIN countries on leads.country=countries.iso2
SET leads.country_id=countries.id

对于leads表上的大约10万行,此查询花了将近40秒。

1 个答案:

答案 0 :(得分:0)

EXPLAIN意味着它正在进行全索引扫描,这不是理想的,但不一定是坏的;在这种情况下,它很好。 iso2索引是covering index,这意味着它包含该表中该查询所需的所有列。基本上,查询优化器决定不是从索引中找到所需的行,然后从表中读取该行以获取id,而是将其转到索引的下一部分,因为它更快

我原本期望优化器在索引上使用引用,但显然它认为这不会有益。由于索引很小,我不担心它没有在索引上使用引用。

其他几点:

  • 请详细说明“大更新时运行速度非常慢”?
  • 表格是使用MyISAM还是InnoDB?
  • countries.id可能会更改为SMALLINT UNSIGNED;这与INT(5)几乎相同,但使用2个字节而不是4个。
  • CHAR(2)iso2
  • 的最佳数据类型