【发布时间】:2011-03-16 12:22:15
【问题描述】:
当我从 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
谁能告诉我这个查询有多糟糕以及它返回了什么?
【问题讨论】:
-
这个查询到底想用自然语言做什么?当阅读它的人无法轻松找出两行查询时,情况确实很糟糕。
-
这将有助于发布表结构,至少是查询中涉及的列,以及它们之间的关系,那么也许我们可以帮助您优化它
-
这看起来像
MySql而不是 SQL Server。你能正确标记吗? -
它应该计算在 ocal_files 中有文件的用户,因为数据库中有很多重复项(由于系统中的错误,用户多次创建帐户),所以我使用不同的电子邮件。
标签: php sql-server ajax query-optimization varnish