2

当我从 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

谁能告诉我查询有多糟糕以及它返回什么?

4

2 回答 2

4

您正在从主查询中的 aiki_user 和 ocal_files 中进行选择,但没有指定连接子句,嵌套查询中的 where 不会停止全表连接......

于 2011-03-16T12:29:19.247 回答
0

我建议对这两个查询运行 EXPLAIN PLAN 并查看数据库告诉您的内容。

我的猜测是你必须做一个表扫描,所以性能很糟糕。

于 2011-03-16T12:30:16.283 回答