两个(非常)大桌子的交叉点

时间:2012-05-22 16:16:12

标签: mysql phpmyadmin

我有两张表:all_usersvip_users

all_users表中包含我系统中所有用户的列表(您没有说?),目前它有大约57,000条记录,而vip_users表有大约37,000条记录。

两个表中的主键都是自动增量id字段。 all_users表在属性计数方面很重要(大约20个,其中一个是email),而vip_users表只有(id} {{1} }属性。

我想通过这样做来查询“nonVip”用户(在this question的帮助下在这里):

email

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

请帮助您解决此问题。

3 个答案:

答案 0 :(得分:3)

尝试索引两个表上的字段电子邮件,这样可以加快查询速度

CREATE INDEX useremail ON all_users(email)

CREATE INDEX vipemail ON vip_users(email)

答案 1 :(得分:0)

我认为NOT INLEFT OUTER JOIN更快,使用的资源更少。

你可以尝试 -

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

答案 2 :(得分:0)

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

您是否希望vip_users拥有来自用户的单独ID?如果您在用户ID字段上将vip_users 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记录不是一个很大的表....