SELECT将检查超过MAX_JOIN_SIZE行

时间:2018-04-24 13:08:30

标签: mysql sql mariadb

我们正在加入3个表,包含~21000行,~2000行和~1600行。

MAX_JOIN_SIZE位于~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行,每个where-line返回~90,~60,~10行。

设置BIG_SQL_QUERY不够好,因为这个问题突然发生了。

在我看来,查询优化器应该可以在首先从3个表中选择然后加入

来处理问题

2 个答案:

答案 0 :(得分:0)

您可以将过滤器添加到JOIN条件

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是JOIN条件,则获得:

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 

答案 1 :(得分:0)

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

如果可能,请使用表格和列的真实姓名;有时会有 intent 的有用线索,这有助于处理性能(等)问题。如果它们不是全部“200”,那么我的答案需要将火山灰喷到它上面。

可能通过使用这些索引可以避免'join'限制。

BC似乎密切相关;是否有理由有两个单独的表? (同样,实际的名字可能已回答了这个问题。)