【问题标题】:Mysql subquery optimization - countMysql子查询优化——count
【发布时间】:2012-06-02 17:56:21
【问题描述】:

我在用于获取一些事件的主查询中有这些子查询:

SELECT [...],
(SELECT COUNT(*) FROM WEventUser WHERE WEventUser.eID=e.eID AND favorited=1) as numfavorited,
(SELECT COUNT(*) FROM WEventUser WHERE WEventUser.eID=e.eID AND subscribed=1) as numsubscribed,
(SELECT COUNT(*) FROM WEventUser WHERE eID=e.eID AND WEventUser.uID=2 AND favorited=1) as favorited,
(SELECT COUNT(*) FROM WEventUser WHERE eID=e.eID AND WEventUser.uID=2 AND subscribed=1) as subscribed,
[...] WHERE...etc.

WEventUser 的结构很简单

CREATE TABLE IF NOT EXISTS `WEventUser` (
  `eID` int(10) unsigned NOT NULL auto_increment,
  `uID` int(10) unsigned NOT NULL,
  `favorited` int(1) unsigned default '0',
  `subscribed` int(1) unsigned default '0',
  PRIMARY KEY  (`eID`,`uID`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8;

这些子查询非常昂贵。你能帮我找到一个替代方案(比如单一连接)吗?

提前致谢!

编辑: 我从一个主 WEvents 表中选择:

CREATE TABLE IF NOT EXISTS `wevents` (
`eID` int(10) unsigned NOT NULL AUTO_INCREMENT,
 `uID` int(10) unsigned DEFAULT NULL,
 `ecID` int(10) unsigned NOT NULL,
 `eName` varchar(64) NOT NULL,
 `eDescription` longtext,
 `eIsActive` varchar(1) NOT NULL DEFAULT '0',
 `eIsValidated` tinyint(4) NOT NULL DEFAULT '-1',
 `eDateAdded` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
 `eDateModified` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
 PRIMARY KEY (`eID`,`ecID`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8;

【问题讨论】:

  • 查询中的 e.eID 是什么。请分享第二个表结构

标签: mysql optimization join query-optimization subquery


【解决方案1】:

您不应该使用子查询,在 COUNT 函数中计算值就足够了,例如-

SELECT [...],
COUNT(IF(wu.favorited = 1, 1, NULL)) as numfavorited,
COUNT(IF(wu.subscribed = 1, 1, NULL)) as numsubscribed,
COUNT(IF(wu.uID=2 AND wu.favorited=1, 1, NULL)) as favorited,
COUNT(IF(wu.uID=2 AND wu.favorited = 1, 1, NULL)) as subscribed,
[...]
FROM
  WEventUser wu
WHERE...etc.

如果您想将WEventUser 加入另一张桌子,您可以轻松地使用这个。

【讨论】:

  • 我正在从另一个表中选择数据,但我正在以这种方式使用您的解决方案:SELECT [...], COUNT(IF(wu.favorited = 1, 1, NULL)) as numfavorited, COUNT(IF(wu.subscribed = 1, 1, NULL)) as numsubscribed, COUNT(IF(wu.uID=2 AND wu.favorited=1, 1, NULL)) as favorited, COUNT(IF(wu.uID=2 AND wu.favorited = 1, 1, NULL)) as subscribed, [...] FROM WEvents we LEFT JOIN WEventUser wu ON wu.eID=e.eID 并且它有效!谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-28
  • 1970-01-01
  • 2011-11-27
  • 2021-04-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多