我有一个countries
表,结构如下,iso2列上有索引:
执行常规选择查询时,iso2索引正常工作:
但是当与iso2上的另一个表连接时,它表现得非常奇怪:
首先它说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秒。
答案 0 :(得分:0)
那EXPLAIN
意味着它正在进行全索引扫描,这不是理想的,但不一定是坏的;在这种情况下,它很好。 iso2
索引是covering index
,这意味着它包含该表中该查询所需的所有列。基本上,查询优化器决定不是从索引中找到所需的行,然后从表中读取该行以获取id
,而是将其转到索引的下一部分,因为它更快
我原本期望优化器在索引上使用引用,但显然它认为这不会有益。由于索引很小,我不担心它没有在索引上使用引用。
其他几点:
countries.id
可能会更改为SMALLINT UNSIGNED
;这与INT(5)
几乎相同,但使用2个字节而不是4个。CHAR(2)
是iso2