我在一个网页上运行four次查询。我用它们进行统计,加载时间太长。
Here是我目前的配置
使用pastebin上的文本环绕按钮,以便于阅读。
我有很多专用于mysql的RAM,但它仍然需要很长时间。我还索引了大部分列。
我只是想看看我还有其他选择。
我把" show create table"和here中的总计数(*)。我将重命名所有内容并粘贴到SO中。我同意将来有人可以使用它。
答案 0 :(得分:2)
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()降序的顺序将与查找列表中字段的硬编码引用相同。
- 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中的相同索引也适用于此。
- 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索引似乎是您更好的选择
- 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之前的任何事情(我猜想的旧数据?)