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 的查询规划器对于依赖子查询有点天真,有时会重复它们直到太阳变成白矮星。