2011-03-16 77 views
2

当我从Varnish缓存服务器在SQL服务器上运行此查询时。为什么这个SQL查询会杀死我的服务器?

select count(distinct email) from aiki_users, ocal_files where userid = 
     (select upload_user from ocal_files where upload_user = userid limit 1) 

利用具有aiki_users表> 80000行

和具有> 30000行ocal_files表。

它杀死了服务器。它通过ajax从一个php脚本中调用。我必须关闭调用它的页面。

我不知道它是什么回报,但我知道我想要做的事情应该由group和by创建,但我不知道如何。

的aiki_users表看起来像这样:

CREATE TABLE IF NOT EXISTS `aiki_users` (
    `userid` int(9) unsigned NOT NULL auto_increment, 
    `username` varchar(100) NOT NULL default '', 
    `full_name` varchar(255) NOT NULL, 
    `country` varchar(255) NOT NULL, 
    `sex` varchar(25) NOT NULL, 
    `job` varchar(255) NOT NULL, 
    `password` varchar(100) NOT NULL default '', 
    `oauth_passcode` varchar(255) NOT NULL, 
    `oauth_token` varchar(255) NOT NULL, 
    `oauth_token_secret` varchar(255) NOT NULL, 
    `usergroup` int(10) NOT NULL default '0', 
    `email` varchar(100) NOT NULL default '', 
    `avatar` varchar(255) NOT NULL, 
    `homepage` varchar(100) NOT NULL default '', 
    `first_ip` varchar(40) NOT NULL default '0', 
    `first_login` datetime NOT NULL, 
    `last_login` datetime NOT NULL, 
    `last_ip` varchar(40) NOT NULL, 
    `user_permissions` text NOT NULL, 
    `maillist` int(1) NOT NULL, 
    `logins_number` int(11) NOT NULL, 
    `randkey` varchar(255) NOT NULL, 
    `is_active` int(5) NOT NULL, 
    PRIMARY KEY (`userid`), 
    KEY `username` (`username`) 
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=3 ; 

我没有对服务器正确的访问,我看不到ocal_files的defnition但:

ocal_files.aiki_users = aiki_users.userid 

可有人告诉我有多糟糕的查询和返回?

+0

你的索引是什么? – Efazati 2011-03-16 12:24:38

+1

这个查询试图用自然语言来做什么?当有人阅读它时,很难找出两行查询,事实上确实很糟糕。 – Jon 2011-03-16 12:26:28

+0

这将有助于发布表结构,至少查询中涉及的列以及它们如何相互关联,那么我们可能会帮助优化它 – 2011-03-16 12:27:06

回答

4

你来自aiki_user和ocal_files主查询选择,没有指定连接子句中嵌套查询的地方是不会停止的全表加入...

+0

我正要提供相同的解决方案。 +1 – dmcnelis 2011-03-16 12:32:18

+0

+1由于未使用显式连接语法而导致的另一个疏忽笛卡尔连接。 – 2011-03-16 12:38:14

+0

哇。现在我明白了?谢谢。我忘了删除这一个。 – jcubic 2011-03-16 12:38:26

0

我会建议在两个查询上运行EXPLAIN PLAN并查看数据库告诉你的内容。

我的猜测是你必须做TABLE SCAN,所以表现很糟糕。

+0

什么是“解释计划”和“桌面扫描” – jcubic 2011-03-16 12:34:12