我需要优化 MySQL 中的以下查询。
基表“A”大约有 9.94 亿条记录。
有没有办法修改not in子句,因为exist子句不适用于MySQL
SELECT DISTINCT
a.Cola1 AS Col1
FROM
db.tableA a
INNER JOIN
db.tableB b ON a.cola2 = b.colb1
INNER JOIN
db.tableC c ON b.colb2 = c.colc1
WHERE
(c.colc2 = 2 OR (c.colc2 = 7047 AND a.cola3 = '04250'))
AND a.Col1 NOT IN (334394 , 334223, 334222, 305669)
ORDER BY a.Col1
这里有 2 个建议(在没有提供示例数据的情况下提出)
SELECT a.Cola1 AS Col1
FROM tableA a
WHERE EXISTS (
SELECT 1
FROM tableB b
WHERE a.cola2 = b.colb1
AND EXISTS (
SELECT 1
FROM tableC c
WHERE b.colb2 = c.colc1 AND (c.colc2 = 2 OR (c.colc2 = 7047 AND a.cola3 = '04250'))
)
)
AND a.Cola1 NOT IN (334394, 334223, 334222, 305669)
ORDER BY a.Cola1;
SELECT a.Cola1 AS Col1
FROM tableA a
WHERE a.Cola2 IN (
SELECT colb1
FROM tableB b
WHERE EXISTS (
SELECT 1
FROM tableC c
WHERE b.colb2 = c.colc1 AND (c.colc2 = 2 OR (c.colc2 = 7047 AND a.Cola3 = '04250'))
)
)
AND a.Cola1 NOT IN (334394, 334223, 334222, 305669)
ORDER BY a.Cola1;
这里有工作示例fiddle