【发布时间】:2021-05-24 12:37:28
【问题描述】:
我有三个不同列的数据表(每个
它们看起来像:
表A
id A1 A2 ...
1 xxx xxx ...
2 xxx xxx ...
... ... ... ...
表 B
id1 B1 B2 ...
1 xxx xxx ...
2 xxx xxx ...
... ... ... ...
表 C
id2 C1 C2 ...
1 xxx xxx ...
2 xxx xxx ...
... ... ... ...
我的目标是让他们加入类似的活动:
id A1 A2 ... B1 B2 ... C1 C2 ...
1 xxx xxx ... xxx xxx ... xxx xxx ...
2 xxx xxx ... xxx xxx ... xxx xxx ...
... ... ... ... ... ... ... ... ... ...
我试图将它们结合在一起使用
CREATE TABLE my_table
SELECT *
FROM table_A
LEFT OUTER JOIN table_B
ON table_A.id = table_B.id1
LEFT OUTER JOIN table_C
ON table_A.id = table_C.id2;
这需要几个小时。但是加入其中两个只需不到 5 分钟的时间:
CREATE TABLE my_table
SELECT *
FROM table_A
LEFT OUTER JOIN table_B
ON table_A.id = table_B.id1
我尝试使用EXPLAIN,结果如下:
id select_type table type posibble_keys key key_len ref rows filtered Extra
1 SIMPLE table_A ALL (Null) (Null) (Null) (Null) 59670 100
1 SIMPLE table_B ALL (Null) (Null) (Null) (Null) 39776 100 Using; Using join buffer (Block Nested Loop) where
1 SIMPLE table_C ALL (Null) (Null) (Null) (Null) 50208 100 Using; Using join buffer (Block Nested Loop) where
我四处搜索,发现帖子说“使用连接缓冲区(块嵌套循环)”是一种低效率的方式,并建议使用 SET optimizer_switch='block_nested_loop=off'; 禁用它。但是,当我尝试这样做时,即使加入两个表也需要 10 多分钟,这似乎是性能的巨大下降。
似乎只有在没有要加入的索引时才使用 BNL,鉴于所有三个表都有“id”列,这是不正确的?
我真的想知道是否有某种方法可以更快地连接这些表。
- 也许我应该调整加入代码的方式?
- 也许我应该打开/关闭某些选项?
- 有什么建议吗?
【问题讨论】:
-
您需要获取表格的所有列吗?否则你不需要使用
select * -
@D-Shih 是的,不幸的是我真的需要所有这些:(
-
请提供
SHOW CREATE TABLE
标签: mysql sql join pivot-table