MySQL-mysql查询使用了临时表的问题

发布于 2016-11-09 03:38:05 字数 614 浏览 1220 评论 2

大家好,在mysql查询时,遇到此查询使用了临时表,请问有什么办法可以解决的。
表结构为:

CREATE TABLE `readmerter400601` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`meterTxID` char(4) NOT NULL,
`current` float(10,3) NOT NULL,
`voltage` float(10,2) NOT NULL,
`power` float(10,1) NOT NULL,
`kwh` float(10,3) NOT NULL,
`temperature` int(10) NOT NULL,
`timestamp` datetime NOT NULL,
`reverseid` int(11) NOT NULL,
PRIMARY KEY (`id`),
KEY `indexreverse` (`reverseid`) USING BTREE,
KEY `indextimestamp` (`timestamp`,`reverseid`,`kwh`) USING BTREE
)

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

灵芸 2017-06-23 23:20:20

SELECT timestamp,kwh,max(kwh) FROM readmerter400601 WHERE timestamp BETWEEN '2013-06-01' and '2013-06-30' GROUP BY day(timestamp) ORDER BY null; 这句话里面我认为你的day('timestamp')应该换成timestamp,首先你已经规定了这是一个月里面的,那么你的day('timestamp')和timestamp其实是没有区别的,因为是一个月里面的,当然如果不是一个月里面的了,可以试着加一个字段,

晚风撩人 2017-02-04 03:03:49

这是因为你的查询中:
GROUP BY day(timestamp), 是对timestamp用了day()函数,然后做分组, 这种情况下, mysql无法用索引来处理group by, 必须先把数据(从覆盖索引中通过where查出的数据)复制到临时表,做分组.

参见group by的实现原理:
http://dev.mysql.com/doc/refman/5.7/en/group-by-optimization.html

The most general way to satisfy a GROUP BY clause is to scan the whole table and create a new temporary table where all rows from each group are consecutive, and then use this temporary table to discover groups and apply aggregate functions (if any). I

最主要的是, 一定要GROUP BY day(timestamp)这么分组么? 感觉很难优化, 要不冗余一个字段day(timestamp), 做索引, 改一下你的sql到这个字段上.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文