【发布时间】: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 显示的不同,第一个示例中的index和ref而第二个示例中的两次index?你查过这些是什么意思了吗? -
发布完整执行计划的图像,这将有所帮助。也可以尝试将其保留为左连接,但只需交换您的表名(与右连接的效果相同)。