0

我有两张桌子:all_usersvip_users

all_userstable 有我系统中所有用户的列表(你不说?),它目前有大约 57k 条记录,而vip_userstable 有大约 37k 条记录。

两个表中的主键都是自动增量id字段。all_userstable 的属性数量很大(大约 20 个,其中之一是email),而vip_userstable 只有(以及idemail属性。

我想通过这样做来查询“非Vip”用户(在这个问题的帮助下):

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

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

请帮助您对此的想法。

4

3 回答 3

3

尝试索引两个表上的电子邮件字段,这应该会加快查询速度

CREATE INDEX useremail ON all_users(email)

CREATE INDEX vipemail ON vip_users(email)
于 2012-05-22T16:43:22.993 回答
0

我认为NOT INLEFT OUTER JOIN.

你能试一下吗 -

SELECT *
FROM all_users
WHERE id NOT IN (SELECT id 
                 FROM vip_users
                 WHERE email IS NULL);
于 2012-05-22T16:26:33.043 回答
0

如所写,您没有得到您正在寻找的结果。您正在查找电子邮件与用户中的电子邮件匹配的 vip_users 行,并且该行也是 NULL。

您是否有理由希望 vip_users 拥有与用户不同的 id?如果您将 vip_users id 字段更改为 users id 字段上的 fk,那么您会将您的选择更改为:

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 条记录不是一个很大的表....

于 2012-05-22T16:31:04.403 回答