查询中的相关计数

时间:2011-10-18 11:23:01

标签: mysql

SELECT 
  buttonID,
  live,
  title,
  image,
  (SELECT COUNT(*) 
    FROM otherdb.buttonclicks t2 
    WHERE t2.buttonid = t1.buttonID AND t2.`type`=0) as count 
FROM buttons t1
GROUP BY buttonID
ORDER BY live DESC, buttonID ASC;

我们网站上有78个广告按钮,并且出于尺寸原因将统计信息与主数据库分开。我们每次点击其中一个按钮时都会记录,并且我正在处理可以快速提取信息的统计屏幕。

以上查询有效,但需要4000秒(字面意思)才能运行,如何才能更有效地获得相同的结果。

将查询运行为:

SELECT
  buttons.buttonID,
  buttons.live,
  buttons.title, 
  buttons.image, 
  count(buttonclicks.id) as count
FROM buttons INNER JOIN otherdb.buttonclicks ON buttons.buttonID = buttonclicks.buttonid
WHERE buttonclicks.type=0
GROUP BY buttons.buttonID
ORDER BY buttons.live DESC, buttons.buttonID ASC

速度更快,但由于WHERE子句的原因,只能选取过去三个月内点击过的按钮(我们存档较旧的点击次数)。

解决方案?

2 个答案:

答案 0 :(得分:0)

尝试在按钮和buttonclicks表上创建索引,以便查询在所需的字段中向前看。

答案 1 :(得分:0)

尝试此查询。

SELECT tbl1.buttonID,
       tbl1.live,
       tbl1.title, 
       tbl1.image, 
       COUNT(tbl2.buttonid) as count
  FROM buttons AS tbl1
 INNER JOIN (SELECT buttonid FROM otherdb.buttonclicks b WHERE b.type=0) tbl2
    ON tbl1.buttonID = tbl2.buttonid
 GROUP BY tbl1.buttonID
 ORDER BY tbl1.live DESC, tbl1.buttonID ASC

我还观察到你有一个图像区域。我认为查询因此而变慢,因为它是处理图像对象的blob类型。