Mysql 不在的替代方案?

Mysql 不在的替代方案?,mysql,sql,Mysql,Sql,我需要检查两个表并找出不一致之处,即意大利城市表中不存在表T1的值。我会解释: T1:包括个人数据(带出生地) 意大利城市:包括意大利的所有城市 表T1大约有9000个元组。 T2有7903个元组 使用“notin”执行查询大约需要16秒 以下是查询: SELECT `T1`.* FROM T1 WHERE ( `T1`.place NOT IN ( SELECT municipality FROM italy_cities ) ) 我的问题 检查不

我需要检查两个表并找出不一致之处,即意大利城市表中不存在表T1的值。我会解释:

T1:包括个人数据(带出生地) 意大利城市:包括意大利的所有城市

表T1大约有9000个元组。 T2有7903个元组

使用“notin”执行查询大约需要16秒

以下是查询:

SELECT
    `T1`.* 
FROM
    T1
WHERE
    (
    `T1`.place NOT IN ( SELECT municipality FROM italy_cities ) 
    )
我的问题
检查不一致性的最佳快速选项是什么?检查官方数据库中不存在的所有“不正确”的市政当局


提前感谢

为此,我通常建议
不存在

SELECT T1.* 
FROM T1
WHERE NOT EXISTS (SELECT 1
                  FROM italy_cities ic
                  WHERE t1.place = ic.municipality
                 );
为什么??原因有两个:

  • 如果子查询返回任何
    NULL
    值,则
    NOT IN
    不会执行您期望的操作。如果哪怕一个值为
    NULL
    所有行最终都会被过滤掉
  • 此版本的查询可以利用
    意大利城市(市政当局)
    上的索引,这似乎是表中的合理索引

  • 为此,我通常建议
    不存在

    SELECT T1.* 
    FROM T1
    WHERE NOT EXISTS (SELECT 1
                      FROM italy_cities ic
                      WHERE t1.place = ic.municipality
                     );
    
    为什么??原因有两个:

  • 如果子查询返回任何
    NULL
    值,则
    NOT IN
    不会执行您期望的操作。如果哪怕一个值为
    NULL
    所有行最终都会被过滤掉
  • 此版本的查询可以利用
    意大利城市(市政当局)
    上的索引,这似乎是表中的合理索引

  • 不存在
    可以执行得更好,但还有另一种方法是
    左连接
    ,如下所示:

    SELECT T1.* 
      FROM T1
      LEFT JOIN italy_cities I ON I.municipality = T1.PLACE
     WHERE I.municipality IS NULL;
    

    不存在
    可以执行得更好,但还有另一种方法是
    左连接
    ,如下所示:

    SELECT T1.* 
      FROM T1
      LEFT JOIN italy_cities I ON I.municipality = T1.PLACE
     WHERE I.municipality IS NULL;
    

    通常存在/不存在是检查不一致性的最佳方法,如果您不需要实际返回数据。请共享更多详细信息,如表结构,并且该查询提供的市政当局的执行计划不可为空,
    不在
    应导致与
    不存在
    相同的执行计划或反联接。至少这是我对更新的MySQL版本的期望。如果您的MySQL版本非常旧,那么情况可能并非如此。对于这两个查询,您都需要在
    t1(place)
    上建立索引。如果您不需要实际返回数据,则通常存在/不存在是检查不一致性的最佳方法。请共享更多详细信息,如表结构,并且该查询提供的市政当局的执行计划不可为空,
    不存在
    应导致与
    不存在
    或反连接相同的执行计划。至少这是我对更新的MySQL版本的期望。如果您的MySQL版本非常旧,那么情况可能并非如此。对于这两个查询,您需要在
    t1(place)
    上建立索引。