需要帮助在一个网页上优化4个重要查询

时间:2014-01-15 17:50:49

标签: mysql optimization

我在一个网页上运行four次查询。我用它们进行统计,加载时间太长。

Here是我目前的配置

使用pastebin上的文本环绕按钮,以便于阅读。

我有很多专用于mysql的RAM,但它仍然需要很长时间。我还索引了大部分列。

我只是想看看我还有其他选择。

我把" show create table"和here中的总计数(*)。我将重命名所有内容并粘贴到SO中。我同意将来有人可以使用它。

1 个答案:

答案 0 :(得分:2)

QUERY ONE

SELECT SQL_NO_CACHE 
      DATE_FORMAT(DateActioned,'%M-%Y') as val1, 
      COUNT(*) AS total_count
   FROM 
      db.statisticsresults
   WHERE 
          DID = 28
      AND ActionTypeID = 1 
      AND DateActioned IS NOT NULL 
   GROUP BY 
      DATE_FORMAT(DateActioned, '%m-%y')
   ORDER BY
      YEAR( DateActioned ) DESC,
      MONTH( DateActioned ) DESC

这个,我会有一个基于你的关键元素的覆盖索引,所以引擎不必回到原始数据......基于这个和你的后续查询,我会在主索引位置有THAT列比如

StatisticsResults -- index ( DID, ActionTypeID, DateActioned )

相应的year()降序和month()降序的顺序将与查找列表中字段的硬编码引用相同。

QUERY TWO

- 381.812

SELECT SQL_NO_CACHE 
      DATE_FORMAT(DateActioned,'%M-%Y') as val1, 
      COUNT(*) AS total_count
   FROM 
      db.statisticsdivision
   WHERE 
          DID = 28
      AND ActionTypeID = 9 
      AND DateActioned IS NOT NULL 
   GROUP BY 
      DATE_FORMAT(DateActioned, '%m-%y')
   ORDER BY 
      YEAR( DateActioned ) DESC,
      MONTH( DateActioned ) DESC

在这一个,DID ='28',我改为DID = 28.如果列是数字,不要让引擎混淆尝试将一个转换为另一个。选项1中的相同索引也适用于此。

QUERY THREE

- 33.899

SELECT SQL_NO_CACHE DISTINCT 
      AID, 
      COUNT(*) AS acount 
   FROM 
      db.statisticsresults
         JOIN db.division_id USING(AID)
   WHERE 
      DID = 28
   GROUP BY 
      AID
   ORDER BY 
      count(*) DESC 
   LIMIT 
      19

这个看起来有点浪费......你根据统计表中的“AID”​​列加入了分区表。你为什么要进行连接,除非你实际上期望分区表中没有一些无效的“AID”​​值?再次,将“DID”列更改为28而不是“28”。确保您的分区表的连接的“AID”​​索引。来自查询1的SECOND索引似乎是您更好的选择

QUERY FOUR

- 21.403

SELECT SQL_NO_CACHE DISTINCT 
      TID, 
      tax, 
      agent, 
      COUNT(*) AS t_count 
   FROM 
      db.statisticsresults sr
         JOIN db.tax_id USING(TID)
            JOIN db.agent_id ai ON(ai.AID = sr.AID)
   WHERE 
      DID = 28 
   GROUP BY 
      TID, 
      sr.AID 
   ORDER BY 
      COUNT(*) DESC 
   LIMIT 19

再次,“DID”列从'28'到28

对于您的TAX_ID表,也有一个覆盖索引,以便它可以处理连接 到代理表而不转到原始页面数据

Tax_ID -- index ( tid, aid )

最后,如果您只处理从2012年1月到2013年12月的原始列表查找事项,您可以通过添加到WHERE子句来简化查询统计数据表...

   AND DateActioned >= '2012-01-01'

所以你完全跳过2012之前的任何事情(我猜想的旧数据?)