我们正在加入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个表中选择然后加入
来处理问题答案 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'限制。
B
和C
似乎密切相关;是否有理由有两个单独的表? (同样,实际的名字可能已回答了这个问题。)