【问题标题】:Multiple joins between tables表之间的多个连接
【发布时间】:2012-07-24 22:51:14
【问题描述】:

我有以下表格,每个表格都有多条记录(~50k)并且表格正在增长。

Table1
BatchID ID Record1

Table 2 
BatchID ID Record2

Table 3
BatchID ID Record3

Table 4 
BatchID ID Record4

以下查询需要永远运行(因为连接是四个表的笛卡尔积)。

Select table1.batchid,
table1.ID,
table1.Record1, 
table2.Record2,
Table3.Record3, 
Table4.Record4 
from Table1 JOIN Table 2
on table1.batchID = table2.batchID and table1.ID = table2.ID
JOIN table3 
on table1.BatchID=table3.batchID and table1.ID = table3.ID 
JOIN table4 
on table1.ID = table4.ID and table1.batchID = table4.batchID 

最好的方法应该是什么。

【问题讨论】:

  • batchid 和 id 都被索引了..
  • 我假设那些 WHERE 实际上是 ON;如果不是,它们应该是,尽管实际上您可以通过使用 USING(id,batchid) 加入每个表来使这更整洁。除此之外,您所有的表都应该在 (id,batchid) 上有索引,仅此而已 - 我不希望这个查询真的花费超过几分之一秒。
  • 需要 1) 结构/索引 2) 查询计划
  • 那是一个错字..我已经更正了..它在..
  • 哦,如果 (batchid,id) 是唯一组合,那么它应该是唯一键而不是索引,但是从这里的信息中我无法判断是否是这种情况。跨度>

标签: mysql sql database-design join


【解决方案1】:

您应该为ON 子句中使用的两列添加索引。例如:

ALTER TABLE `table2` ADD INDEX `IDX_batchid-ID` (`batchid`, `ID`);

【讨论】:

    【解决方案2】:

    首先想到的是,您希望在所有四个表上的 (batchid, id) 上都有一个复合索引。这将最匹配查询中的连接条件。

    表中有多少条记录相互匹配具有相同的batchid 和id?可能还有其他方式来表达查询。

    【讨论】:

    • 我的所有表中都有索引,包括这个。所有 50k 记录将使用相同的批处理 ID 和 ID 相互匹配。 BatchID 和 ID 是所有表中的复合键..
    • 愚蠢的问题.. 但是在我创建索引之后,我是加入索引还是实际表?
    • SQL 引擎自动使用索引。
    • 您不能仅加入索引列。尝试使用 EXPLAIN 检查每个 JOIN 使用了哪些索引
    • 我将batchID和ID作为索引添加到每个索引中,但仍然需要很多时间..
    【解决方案3】:

    你真的需要所有这些JOIN吗?你不能把这四个表合并在一起吗?

    例如:

    CREATE TABLE MergedTable (
        BatchID INT,
        ID INT,
        Record1 ... ,
        Record2 ... ,
        Record3 ... ,
        Record4 ... ,
        PRIMARY KEY (BatchID, ID)
    )
    

    然后:

    INSERT INTO MergedTable <your query>
    

    您现在可以直接从 MergedTable 中选择,无需任何 JOIN。

    【讨论】:

    • 这就是我最终做的事情...... :)
    【解决方案4】:

    您的加入看起来不错。尝试在 BatchID 和 ID 的组合上创建索引。

    dev.mysql.com

    【讨论】:

    • 愚蠢的问题.. 但是在创建索引之后,我是加入索引还是实际表? ——
    • 连接将在使用索引列的实际表上。
    • 我将batchID和ID作为索引添加到每个索引中,但仍然需要很多时间..
    猜你喜欢
    • 2019-02-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-29
    • 2013-02-08
    • 2022-07-22
    • 2013-08-06
    • 1970-01-01
    相关资源
    最近更新 更多