首页 > 解决方案 > 将 MySQL 查询从用户名更改为电子邮件会导致超时

问题描述

如果我运行此代码检查userid,我会在 1 秒内得到结果

    SELECT userid, username, email
    FROM db_main.users
    WHERE userid NOT IN 
    (
        SELECT userid 
        FROM db_backup.user 
    );

如果我将其更改为username,我仍然会在 1 秒内得到结果

    SELECT userid, username, email
    FROM db_main.users
    WHERE username NOT IN 
    (
        SELECT username 
        FROM db_backup.user 
    );

但是,如果我将其更改为email,则查询将在 30 秒后超时。

    SELECT userid, username, email
    FROM db_main.users
    WHERE email NOT IN 
    (
        SELECT email 
        FROM db_backup.user 
    );

任何想法为什么?谢谢!

标签: mysqlsqlconnection-timeout

解决方案


首先,不要使用NOT IN. 你可以NOT EXISTS改用。

SELECT userid, username, email
    FROM db_main.users u
    WHERE NOT EXISTS
    (
        SELECT email 
        FROM db_backup.user b
       WHERE b.email = u.email
    );

注意:搜索如何email在两个user表中创建索引和创建索引。还搜索为什么我不应该使用NOT IN. 它会导致错误的结果NULL


推荐阅读