MySQL-mysql查询使用了临时表的问题
大家好,在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 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
SELECT
timestamp
,kwh,max(kwh) FROMreadmerter400601
WHEREtimestamp
BETWEEN '2013-06-01' and '2013-06-30' GROUP BY day(timestamp
) ORDER BY null; 这句话里面我认为你的day('timestamp')应该换成timestamp,首先你已经规定了这是一个月里面的,那么你的day('timestamp')和timestamp其实是没有区别的,因为是一个月里面的,当然如果不是一个月里面的了,可以试着加一个字段,这是因为你的查询中:
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到这个字段上.