NOT IN 查询响应时间过长
NOT IN query takes too long to respond
我有一个 table 大约有 20000 条记录。我正在运行宁此查询
SELECT DISTINCT t.ci_record_id FROM `ip_connection` t WHERE
t.remote_ip NOT IN (
SELECT DISTINCT t1.ipAddress FROM ci_table t1 WHERE
t1.blueprint_id IN (SELECT t2.id FROM blueprints t2 WHERE t2.ci_part=FALSE)
AND t1.archive=FALSE
);
相同的查询,如果我 运行 带有 IN 子句,它将在几秒钟内 运行 并 return 18000 条记录。 NOT IN 查询只是挂起系统。
您或许可以使用 LEFT JOIN ... IS NULL
模式来提升它。这里有一些东西可以尝试。
SELECT DISTINCT t.ci_record_id
FROM ip_connection t
LEFT JOIN (
SELECT DISTINCT t1.ipAddress
FROM ci_table t1
JOIN blueprints t2 ON t1.blueprint_id = t2.i2
AND t2.ci_part=FALSE
WHERE t1.archive = FALSE
) ta ON t.remote_ip = ta.ipAddress
WHERE ta.ipAddress IS NULL
我在这里所做的是分解出你的依赖子查询(你的 NOT IN
中的子查询)并将它变成一个独立的子查询,就像这样。
SELECT DISTINCT t1.ipAddress
FROM ci_table t1
JOIN blueprints t2 ON t1.blueprint_id = t2.i2
AND t2.ci_part=FALSE
WHERE t1.archive = FALSE
您应该能够独立测试此子查询。它应该产生与未归档蓝图项目列表相对应的未归档 t1 项目列表。
然后,我 LEFT JOIN
将其编辑到您的顶层 table,然后我在联接的右侧查找 NULL 项目。这些 NULL 项对应于连接左侧与 ON 子句不匹配的行。这就是独立子查询的方式NOT IN
。
这可能对您有所帮助,因为 MySQL 的查询规划器对于依赖子查询有点天真,有时会重复它们直到太阳变成白矮星。
我有一个 table 大约有 20000 条记录。我正在运行宁此查询
SELECT DISTINCT t.ci_record_id FROM `ip_connection` t WHERE
t.remote_ip NOT IN (
SELECT DISTINCT t1.ipAddress FROM ci_table t1 WHERE
t1.blueprint_id IN (SELECT t2.id FROM blueprints t2 WHERE t2.ci_part=FALSE)
AND t1.archive=FALSE
);
相同的查询,如果我 运行 带有 IN 子句,它将在几秒钟内 运行 并 return 18000 条记录。 NOT IN 查询只是挂起系统。
您或许可以使用 LEFT JOIN ... IS NULL
模式来提升它。这里有一些东西可以尝试。
SELECT DISTINCT t.ci_record_id
FROM ip_connection t
LEFT JOIN (
SELECT DISTINCT t1.ipAddress
FROM ci_table t1
JOIN blueprints t2 ON t1.blueprint_id = t2.i2
AND t2.ci_part=FALSE
WHERE t1.archive = FALSE
) ta ON t.remote_ip = ta.ipAddress
WHERE ta.ipAddress IS NULL
我在这里所做的是分解出你的依赖子查询(你的 NOT IN
中的子查询)并将它变成一个独立的子查询,就像这样。
SELECT DISTINCT t1.ipAddress
FROM ci_table t1
JOIN blueprints t2 ON t1.blueprint_id = t2.i2
AND t2.ci_part=FALSE
WHERE t1.archive = FALSE
您应该能够独立测试此子查询。它应该产生与未归档蓝图项目列表相对应的未归档 t1 项目列表。
然后,我 LEFT JOIN
将其编辑到您的顶层 table,然后我在联接的右侧查找 NULL 项目。这些 NULL 项对应于连接左侧与 ON 子句不匹配的行。这就是独立子查询的方式NOT IN
。
这可能对您有所帮助,因为 MySQL 的查询规划器对于依赖子查询有点天真,有时会重复它们直到太阳变成白矮星。