2013-03-13 58 views
4

我有一個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 

該查詢花了將近40秒的leads表約10萬行。

回答

0

EXPLAIN這意味着它正在做一個完整的索引掃描,這並不理想,但不一定是壞的;在這種情況下,它很好。 iso2索引是covering index,這意味着它包含該查詢的該表所需的所有列。基本上,查詢優化器決定,不是從索引中找到所需的行,然後從表中讀取該行以獲取id,而只是進入索引的下一部分,因爲速度更快。

我會期望優化器在索引上使用引用,但顯然它決定這不會有好處。由於指數很小,我不擔心它沒有在指數上使用參考。

其他一些要點:

  • 能否請您闡述一下「它運行在大的更新速度非常慢」?
  • 該表是否使用MyISAM或InnoDB?
  • countries.id可能可能更改爲SMALLINT UNSIGNED;這是幾乎相同INT(5),但是使用2個字節,而不是4。
  • CHAR(2)iso2
+0

我增加了一個示例更新的最佳數據類型。它使用MyISAM,但我嘗試切換引擎,沒有任何改變。我不明白的是,在連接執行「完整索引掃描」時,「SELECT」似乎只需要瀏覽1行? – hellohellosharp 2013-03-13 14:50:59