当我从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
可有人告诉我有多糟糕的查询和返回?
你的索引是什么? – Efazati 2011-03-16 12:24:38
这个查询试图用自然语言来做什么?当有人阅读它时,很难找出两行查询,事实上确实很糟糕。 – Jon 2011-03-16 12:26:28
这将有助于发布表结构,至少查询中涉及的列以及它们如何相互关联,那么我们可能会帮助优化它 – 2011-03-16 12:27:06