Mysql 如何加速不在查询中的查询?

Mysql 如何加速不在查询中的查询?,mysql,Mysql,我有以下疑问: SELECT images.id from images WHERE images.id NOT IN ( SELECT temp.target_id FROM ( SELECT images_user_groups.images_id AS target_id, images_user_groups.user_groups_id AS source_id FROM

我有以下疑问:

SELECT images.id from images WHERE images.id NOT IN
(
    SELECT
        temp.target_id

    FROM (
        SELECT
            images_user_groups.images_id AS target_id,
            images_user_groups.user_groups_id AS source_id

        FROM
            images_user_groups
    ) AS temp

        INNER JOIN
        user_groups ON user_groups.id = temp.source_id
    INNER JOIN
        images ON images.id = temp.target_id
    WHERE
        user_groups.description LIKE "%Freigabe ins Presseportal%"
    GROUP BY
        temp.target_id
)
它运行着,但速度非常慢——5分钟,我写这篇文章的时候还在数。(我正在运行的
NOT IN
子查询返回36000行,并且我假设父查询正在花时间对照36000行检查
images
表中38000个条目中的每一个。)


有什么方法可以加快查询速度吗?

您可以尝试下面的方法

SELECT images.id from images WHERE images.id NOT IN
(
    SELECT images_user_groups.images_id 
    FROM images_user_groups INNER JOIN user_groups ON user_groups.id = images_user_groups.user_groups_id
    inner join images ON images.id = images_user_groups.images_id
    WHERE user_groups.description LIKE "%Freigabe ins Presseportal%"
)A
将其作为
左连接写入,在
用户组中查找
NULL
值,以指示图像不在该组中,应该会快得多:

SELECT i.id 
FROM images i
JOIN images_user_groups iu ON iu.images_id = i.id
LEFT JOIN user_groups u ON u.id = iu.user_groups_id AND u.description LIKE "%Freigabe ins Presseportal%"
GROUP BY i.id
HAVING COUNT(u.id) = 0

NOT IN
NOT EXISTS
的问题在于必须为
图像中的每一行计算
WHERE
子句

谢谢您的回答。此查询将导致选择109123行,这比我们在images表中的行数还要多。(图像表中大约有38000行。)因此这里有问题。@Patrickatwork抱歉,不允许每个图像有多个用户组。请检查我的编辑。@Patrickatwork我很想知道它的速度有多快。它几乎是瞬间运行的——0.01秒。谢谢你的回答。在目前为止的三个答案中,这是唯一一个似乎返回正确结果的答案。我不知道为什么会被否决。你在最新版本的MySQL 8.0(8.0.17)上尝试过这个查询吗?它支持所谓的反连接,这将提高NOT IN子查询的性能。