我有两张表:all_users
和vip_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查询?
请帮助您解决此问题。
答案 0 :(得分:3)
尝试索引两个表上的字段电子邮件,这样可以加快查询速度
CREATE INDEX useremail ON all_users(email)
CREATE INDEX vipemail ON vip_users(email)
答案 1 :(得分:0)
我认为NOT IN
比LEFT 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记录不是一个很大的表....