【问题标题】:LEFT JOIN is fast but RIGHT JOIN is slow even though the same indexes are on both tablesLEFT JOIN 很快,但 RIGHT JOIN 很慢,即使两个表上都有相同的索引
【发布时间】:2015-12-31 21:59:16
【问题描述】:

我有两张表,都有大约 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  |
 ----------------------------------------------------------------------------------------------------------------------------

但是,当我进行 RIGHT 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 查询需要这么长时间吗?

【问题讨论】:

  • 如果您在 FROM 语句中切换表的顺序,您是否会遇到同样的问题(只是反过来)?
  • 很难将 EXPLAIN 中的值与格式对齐...我已经编辑过,但请。检查以确保我把东西放在正确的地方。尤其是因为看起来有一些空白字段。
  • 感谢重新格式化,PeteGO!是的,当我在 FROM 语句中切换表的顺序时,我确实遇到了同样的问题。
  • 注意 type 值 EXPLAIN 显示的不同,第一个示例中的 indexref 而第二个示例中的两次 index?你查过这些是什么意思了吗?
  • 发布完整执行计划的图像,这将有所帮助。也可以尝试将其保留为左连接,但只需交换您的表名(与右连接的效果相同)。

标签: mysql join indexing


【解决方案1】:

问题在于其中一张表中有 UTF-8 内容。我将所有内容都更改为 Latin1,它现在双向运行都很快。

见:this discussion

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-04
    • 2012-06-26
    • 2013-02-11
    • 2012-01-01
    • 1970-01-01
    • 2016-11-18
    相关资源
    最近更新 更多