首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何使用“文件排序”和“使用临时”优化MySQL查询(超过10秒)

如何使用“文件排序”和“使用临时”优化MySQL查询(超过10秒)
EN

Stack Overflow用户
提问于 2012-12-19 09:51:42
回答 1查看 169关注 0票数 0

我知道有上千个类似的问题,我读过很多问题,但我不知道如何提高以下查询的性能:

代码语言:javascript
运行
复制
SELECT DATE_FORMAT(c.date, "%d/%m/%Y") AS ddmmyy, c.idQualification, q.name,
SUM(idContactList = "") + COUNT( DISTINCT NULLIF( CONCAT( c.idContactList, c.idActivity ), "" ) ) AS numCalls

FROM callsBreakdown c
LEFT JOIN qualification q ON q.idQualification = c.idQualification
LEFT JOIN activityCampaign a ON (a.idActivity = c.idActivity)
LEFT JOIN qualificationCampaign qc ON (qc.idCampaign = a.idCampaign AND qc.idQualification = c.idQualification)

WHERE c.date BETWEEN "2011-01-01" AND "2012-10-01"
GROUP BY c.date, q.name 

如果日期范围很宽,比如1年或更长时间,则查询需要10-12秒才能完成。在关于callsBreakdown表的解释中(其他表在额外列中有“使用索引”,而且速度很快):

代码语言:javascript
运行
复制
id  select_type table type  possible_keys   key     key_len ref   rows    Extra
1   SIMPLE       c     ALL  date           NULL     NULL  NULL  379553  Using where; Using temporary; Using filesort

服务器不使用日期索引,需要临时表和文件。有什么想法吗?谢谢!

编辑:我将别名"date“更改为"ddmmyy”,结果是相同的。化名不是问题所在。

编辑2:如果日期范围是两个月或更短,MySQL使用日期索引(键)代替"NULL“键

EN

回答 1

Stack Overflow用户

发布于 2012-12-19 09:54:34

在编写GROUP BY date时,它使用别名,它是这里函数调用的输出:

代码语言:javascript
运行
复制
SELECT DATE_FORMAT(c.date, "%d/%m/%Y") AS date, ...

相反,尝试按原始表中的列分组,这应该允许ORDER使用索引:

代码语言:javascript
运行
复制
GROUP BY c.date, q.name
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13949611

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档