【问题标题】:Why does this SQL query kill my server?为什么这个 SQL 查询会杀死我的服务器?
【发布时间】: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


【解决方案1】:

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

【讨论】:

  • 我正要给出同样的解决方案。 +1
  • +1 另一个因未使用显式连接语法而导致的无意笛卡尔连接。
  • 哇。现在我明白了?谢谢。我忘记删除这个了。
【解决方案2】:

我建议对两个查询都运行 EXPLAIN PLAN 并查看数据库告诉您的信息。

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

【讨论】:

  • 什么是“EXPLAIN PLAN”和“TABLE SCAN”
猜你喜欢
  • 1970-01-01
  • 2014-01-22
  • 1970-01-01
  • 1970-01-01
  • 2015-09-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-01
相关资源
最近更新 更多