4

我有一个countries这样的表,在 iso2 列上有一个索引:


在此处输入图像描述


进行普通选择查询时,iso2 索引工作正常:


在此处输入图像描述


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


在此处输入图像描述


首先它说NULLpossible_keys 但它仍然使用它?然后它还说 256 行这是整个表。它在大更新时运行非常慢,所以我可以看出它没有使用索引。这里有什么问题?

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


更多信息:我一直在尝试规范化我的数据并使用 acountry_id而不是country. country_id当我注意到它变得非常缓慢时,我正在更新表格。一些解释让我发现索引没有被使用。也许它与 iso2 是 char(2) 有关?

我正在像这样填充 country_id:

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

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

4

1 回答 1

0

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

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

其他几点:

  • 您能否详细说明“在大更新时运行速度非常慢”?
  • 表是使用 MyISAM 还是 InnoDB?
  • countries.id可能会更改为SMALLINT UNSIGNED; 这与 几乎相同INT(5),但使用 2 个字节而不是 4 个字节。
  • CHAR(2)是最好的数据类型iso2
于 2013-03-13T14:03:29.177 回答