Mysql 需要帮助优化一个网页上的4个繁重查询吗
我有在一个网页上运行的查询。我使用它们进行统计,加载时间太长 我当前的配置是什么 使用pastebin上的文字换行按钮使其更易于阅读 我有很多专门用于mysql的RAM,但仍然需要很长时间。我还为大多数列编制了索引 我只是想看看我还有什么选择 我把“show create table”和总计数(*)放进去。我将重命名所有内容并粘贴到中。我同意将来可能会有人使用它。QUERY ONE 这,我将有一个覆盖指数的基础上,您的关键要素,使引擎不必返回到原始数据。。。基于此查询和下面的查询,我会将该列置于主索引位置,例如Mysql 需要帮助优化一个网页上的4个繁重查询吗,mysql,optimization,Mysql,Optimization,我有在一个网页上运行的查询。我使用它们进行统计,加载时间太长 我当前的配置是什么 使用pastebin上的文字换行按钮使其更易于阅读 我有很多专门用于mysql的RAM,但仍然需要很长时间。我还为大多数列编制了索引 我只是想看看我还有什么选择 我把“show create table”和总计数(*)放进去。我将重命名所有内容并粘贴到中。我同意将来可能会有人使用它。QUERY ONE 这,我将有一个覆盖指数的基础上,您的关键要素,使引擎不必返回到原始数据。。。基于此查询和下面的查询,我会将该列置于
StatisticsResults -- index ( DID, ActionTypeID, DateActioned )
按年份()降序和按月份()降序的顺序与硬编码引用在列表中查找字段的操作相同
问题二
--381.812
在这个例子中,DID=28,我改为DID=28。如果列是数字的,不要让引擎在尝试将一个列转换为另一个列时感到困惑。选项1中的相同索引也适用于此处
问题三
--33.899
这个看起来有点浪费。。。您将根据统计表中的“AID”列加入到division表。为什么要进行连接,除非您实际期望除法表中没有一些无效的“AID”值?同样,将“DID”列更改为28,而不是“28”。确保分区表的索引位于联接的“AID”上。查询1中的第二个索引似乎是更好的选择
问题四
--21.403
同样,“DID”列从'28'到28
对于您的TAX_ID表,在其上也有一个覆盖索引,以便它可以处理连接
转到代理表,而不转到原始页数据
Tax_ID -- index ( tid, aid )
最后,如果您处理的是从2012年1月到2013年12月的原始列表,那么您可以通过添加WHERE子句来简化查询整个统计表的过程
AND DateActioned >= '2012-01-01'
因此,您完全跳过了2012年之前的任何内容(我想是旧数据吧?请将所有必要信息直接输入您的问题中。链接断开,我们希望为将来的访问者保留帖子。我在网上有我不想要的敏感数据。@Dev Ria您刚刚将其发布到网上……正确。pastebin过期。如果您希望我们帮助优化查询,则需要向我们显示表和索引定义,以及每个表的行计数。也许您的表定义不好。可能索引没有正确创建。也许你在你认为你有的专栏上没有索引。如果看不到表和索引定义,我们无法判断。我们还需要行计数,因为这会极大地影响查询优化。如果您知道如何进行
解释或获取执行计划,请将结果也放在问题中。@DevRia,只是为了笑一下,索引和调整后的最终查询性能如何。它们从380多秒增加到了3.167秒!谢谢你的建议!!
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
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
Tax_ID -- index ( tid, aid )
AND DateActioned >= '2012-01-01'