Mysql 两个(非常)大表的交集

Mysql 两个(非常)大表的交集,mysql,phpmyadmin,Mysql,Phpmyadmin,我有两个表:all\u用户和vip\u用户 all_users表中有我的系统中所有用户(您不说?)的列表,目前约有57k条记录,而vip_users表中约有37k条记录 两个表中的主键都是自动递增id字段all_users表在属性计数方面很大(大约20个,其中一个是email),而vip_users表只有(连同id)email属性 我想通过这样做来查询出“非IP”用户(在这里的帮助下): 现在,终于有问题了——我在phpmyadmin中运行了这个查询,甚至在20分钟后,我被迫关闭它并重新启动ht

我有两个表:
all\u用户
vip\u用户

all_users
表中有我的系统中所有用户(您不说?)的列表,目前约有57k条记录,而
vip_users
表中约有37k条记录

两个表中的主键都是自动递增
id
字段
all_users
表在属性计数方面很大(大约20个,其中一个是
email
),而
vip_users
表只有(连同
id
email
属性

我想通过这样做来查询出“非IP”用户(在这里的帮助下):

现在,终于有问题了——我在phpmyadmin中运行了这个查询,甚至在20分钟后,我被迫关闭它并重新启动httpd服务,因为它花费了太长的时间才能完成,我的服务器负载超过了2,并且该站点(也查询数据库)变得无用,因为它的加载速度太慢。所以,我的问题是——我如何提出这个问题?我是否制作了一些脚本并在夜间运行—不使用phpmyadmin(这可能是问题所在?),还是需要使用不同的SQL查询


请帮我想一想。

我认为
不在
左外连接更快,使用的资源更少

你能试试吗

SELECT *
FROM all_users
WHERE id NOT IN (SELECT id 
                 FROM vip_users
                 WHERE email IS NULL);

我认为
notin
LEFT-OUTER-JOIN
更快,使用的资源更少

你能试试吗

SELECT *
FROM all_users
WHERE id NOT IN (SELECT id 
                 FROM vip_users
                 WHERE email IS NULL);

如前所述,你没有得到你想要的结果。您正在查找vip_用户行,其中电子邮件与用户中的电子邮件匹配,并且也是空的

您是否有理由希望vip_用户与其他用户具有单独的id?如果将“vip_用户id”字段更改为“用户id”字段上的fk,则yo会将选择更改为:

SELECT all_users.id, all_users.email
FROM all_users 
LEFT OUTER JOIN vip_users 
    ON (all_users.id=vip_users.id) 
WHERE vip_users.email IS NULL;

这个查询没有理由需要任何时间。37k记录不是一个很大的表……

如前所述,您没有得到所需的结果。您正在查找vip_用户行,其中电子邮件与用户中的电子邮件匹配,并且也是空的

您是否有理由希望vip_用户与其他用户具有单独的id?如果将“vip_用户id”字段更改为“用户id”字段上的fk,则yo会将选择更改为:

SELECT all_users.id, all_users.email
FROM all_users 
LEFT OUTER JOIN vip_users 
    ON (all_users.id=vip_users.id) 
WHERE vip_users.email IS NULL;

这个查询没有理由需要任何时间。37k记录不是一个很大的表….

尝试为两个表上的电子邮件字段编制索引,这将加快查询速度

CREATE INDEX useremail ON all_users(email)

CREATE INDEX vipemail ON vip_users(email)

尝试为两个表上的电子邮件字段编制索引,这将加快查询速度

CREATE INDEX useremail ON all_users(email)

CREATE INDEX vipemail ON vip_users(email)

这些表有索引吗?尝试在两个表上索引电子邮件字段您是否打算以用户id而不是电子邮件加入?如前所述,您是通过电子邮件地址加入的,然后检查它是否为空?@jwismar id在两个表上都是自动递增的,它们不会匹配37k和57k并不是很大。@Nico:将其作为答案发布。101%问题是缺少索引。这些表有索引吗?尝试在两个表上索引电子邮件字段您是否打算以用户id而不是电子邮件加入?如前所述,您是通过电子邮件地址加入的,然后检查它是否为空?@jwismar id在两个表上都是自动递增的,它们不会匹配37k和57k并不是很大。@Nico:将其作为答案发布。101%的问题是缺少索引。在MySQL中,您特别不希望使用subselect。连接要快得多。编辑-我只是双重检查,在MySQL>=6.0版中可能不再如此。@jwismar:不,您将(选择…
)中的
行为与(选择…
)中的
行为混淆,后者通常比较慢,而
不在(选择…
中的行为很少有任何问题。在MySQL中,
LEFT JOIN/IS NULL
不存在(子查询)
的性能类似,您特别不想使用subselect。连接要快得多。编辑-我只是双重检查,在MySQL>=6.0版中可能不再如此。@jwismar:不,您将(选择…
)中的
行为与(选择…
)中的
行为混淆,后者通常比较慢,而
不在(选择…
中的行为很少有任何问题。与
LEFT JOIN/类似的性能为NULL
不存在(子查询)
哦,你说得太对了!,现在,我可以引用这样的话来回答:“显示第0-29行(总计21714行,查询耗时0.0043秒)”哦,你说得太对了!,现在,我用引号给出了答案:“显示第0-29行(总计21714行,查询耗时0.0043秒)”