SQL:"NOT IN"子查询优化或替代方案

krn*_*krn 9 mysql subquery

我有两个数据库表:"places"和"translations".地名的翻译是通过从"地点"中选择记录来完成的,这些记录还没有指定语言的翻译:

SELECT `id`, `name`
FROM `places`
WHERE `id` NOT IN (SELECT `place_id` FROM `translations` WHERE `lang` = 'en')
Run Code Online (Sandbox Code Playgroud)

这可以很好地处理7 000个地方的记录,但是当翻译数达到5 000时崩溃.从那时起,查询大约需要10秒并返回错误:

2006年 - MySQL服务器已经消失

据我所知,这里的主要问题是子查询返回到很多结果,如果我需要选择所有尚未翻译的地方,我怎么能解决呢?

我的计划B是在"places"表中创建一个新的布尔字段,称为"翻译",并在每次更改语言时将其重置为"false" - 这将阻止子查询.但是,也许我可以修改当前的SQL语句并防止添加其他字段?

Tom*_*lak 14

明显的替代方案:

SELECT
  `id`, `name`
FROM
  `places`
WHERE 
  NOT EXISTS (
    SELECT 1 FROM `translations` WHERE `id` = `places`.`id` AND `lang` = 'en'
  )
Run Code Online (Sandbox Code Playgroud)

应该有一个聚簇复合索引(translations.id, translations.lang)(复合意味着:多个字段上的单个索引,聚簇意味着:索引控制表的排序方式).