select将检查超过max\u join\u大小的行

cl25kdpy  于 2021-06-24  发布在  Mysql
关注(0)|答案(2)|浏览(250)

我们将连接3个表,分别为~21000行、~2000行和~1600行。
最大连接大小约为8.000.000。每个表都包含一个名为providerid的列。
查询如下:

SELECT
   A.ID, B.ID, C.ID
FROM       A 
INNER JOIN B 
   ON A.ID = B.aID 
INNER JOIN C 
   ON A.ID = C.aID
WHERE
   A.providerID = 200 AND
   B.providerID = 200 AND
   C.providerID = 200

整个查询返回3行,每行返回~90、~60、~10行。
由于这个问题突然发生,设置大的sql查询不够好。
在我看来,查询优化器应该能够处理问题,首先从3个表中进行选择,然后连接

x759pob2

x759pob21#

SELECT  A.ID, B.ID, C.ID
    FROM  A
    INNER JOIN  B  ON A.ID = B.aID
                  AND A.providerID = B.providerID
    INNER JOIN  C  ON A.ID = C.aID
                  AND A.providerID = C.providerID
    WHERE  A.providerID = 200

并添加

A:  INDEX(providerID, ID)   -- In this order
B:  INDEX(providerID, aID)  -- In either order
C:  INDEX(providerID, aID)  -- In either order

如果可能,请使用表和列的实名;有时有一些有用的意图线索可以帮助处理性能(etc)问题。如果它们不是都是“200”,那么我的答案需要火山灰喷到上面。
可能通过使用这些索引可以避免“join”限制。
看来 B 以及 C 密切相关;有没有理由要两张分开的table(同样,实际姓名可能已经回答了这个问题。)

xtupzzrd

xtupzzrd2#

可以将筛选器添加到联接条件

SELECT
   A.ID, B.ID, C.ID
FROM   A 
JOIN   B 
  ON  A.<something> = B.<something>
 AND  A.providerID = <value>
 AND  B.providerID = <value>
JOIN   C
  ON  A.<something> = C.<something>
 AND  C.providerID = <value>

现在,如果providerid是获得的连接条件:

SELECT
   A.ID, B.ID, C.ID
FROM   A 
JOIN   B 
  ON  A.providerID  = B.providerID 
 AND  A.providerID = <value>
JOIN   C
  ON  B.providerID  = C.providerID

相关问题