Mysql 不在的替代方案?
我需要检查两个表并找出不一致之处,即意大利城市表中不存在表T1的值。我会解释: T1:包括个人数据(带出生地) 意大利城市:包括意大利的所有城市 表T1大约有9000个元组。 T2有7903个元组 使用“notin”执行查询大约需要16秒 以下是查询: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 ) ) 我的问题 检查不
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)
上建立索引。