LEFT JOIN很快但是RIGHT JOIN很慢,即使两个表上都有相同的索引

时间:2015-10-03 23:04:06

标签: mysql join indexing

我有两张桌子,都有大约200,000条记录。我想在KEY上加入它们,这是一个字符串。

两个表都有索引KEY,VALUE。我跑的时候:

   SELECT vpn, t1_sku, t2_sku 
     FROM first_inventory 
LEFT JOIN second_inventory USING (vpn)

真的很快。这是解释输出:

 ----------------------------------------------------------------------------------------------------------------------------
 | id | select_type | table            | type     | possible_keys   | key     | key_len   | ref     | rows   | Extra        |
 |----|-------------|------------------|----------|-----------------|---------|-----------|---------|--------|--------------|
 | 1  | SIMPLE      | first_inventory  | index    |                 | t1_vpn  | 158       |         | 204437 | Using index  |
 | 1  | SIMPLE      | second_inventory | ref      | t2_vpn          | t2_vpn  | 387       | func    | 1      | Using index  |
 ----------------------------------------------------------------------------------------------------------------------------

然而,当我做一个正确的JOIN时,它需要永远而且永远不会结束:“SELECT vpn,t1_sku,t2_sku FROM first_inventory RIGHT JOIN second_inventory USING(vpn)”。这是解释输出:

 ----------------------------------------------------------------------------------------------------------------------------
 | id | select_type | table            | type     | possible_keys   | key     | key_len   | ref     | rows   | Extra        |
 |----|-------------|------------------|----------|-----------------|---------|-----------|---------|--------|--------------|
 | 1  | SIMPLE      | second_inventory | index    |                 | t1_vpn  | 773       |         | 220996 | Using index  |
 | 1  | SIMPLE      | first_inventory  | index    |                 | t2_vpn  | 158       |         | 204437 | Using index  |
 ----------------------------------------------------------------------------------------------------------------------------

我可以看到RIGHT JOIN查询似乎在查看220996 x 204437行,而LEFT JOIN似乎只看204437行,但我无法弄清楚为什么我两个表上都有相同的索引。

在两个表的末尾都说:

PRIMARY KEY ('id'),
  KEY 't1_vpn' ('vpn','t1_sku') USING BTREE
and
PRIMARY KEY ('id'),
  KEY 't2_vpn' ('vpn','t2_sku') USING BTREE

知道为什么RIGHT JOIN查询花了这么长时间?

1 个答案:

答案 0 :(得分:1)

问题是其中一个表中有UTF-8内容。我将所有内容都更改为Latin1,现在它可以快速运行。

请参阅:this discussion