为什么这个SQL查询会杀死我的服务器?

时间:2011-03-16 12:22:15

标签: php sql-server ajax query-optimization varnish

当我从Varnish缓存服务器在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行

ocal_files表格有> 30000行。

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

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

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的定义但是:

 ocal_files.aiki_users = aiki_users.userid

有人可以告诉我查询有多糟糕以及它返回什么内容?

2 个答案:

答案 0 :(得分:4)

您正在主查询中选择aiki_user和ocal_files,而不指定join子句,嵌套查询中的位置不会停止整个表连接...

答案 1 :(得分:0)

我建议在两个查询上运行EXPLAIN PLAN,看看数据库告诉你什么。

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