MySql在group by使用函数时优化group by
我有一个具有以下模式的表硬制动器:MySql在group by使用函数时优化group by,mysql,innodb,Mysql,Innodb,我有一个具有以下模式的表硬制动器: -------------------- -------------------- | Column Name | Type | -------------------- -------------------- | id | CHAR(36) primary | -------------------- -----------
-------------------- --------------------
| Column Name | Type |
-------------------- --------------------
| id | CHAR(36) primary |
-------------------- --------------------
| vehicleId | CHAR(36) |
-------------------- --------------------
| address | VARCHAR(50) |
-------------------- --------------------
| time | TIMESTAMP |
-------------------- --------------------
现在,当我运行查询并尝试使用time column with day()函数对其进行分组,并在select查询上使用EXPLAIN EXTENDED时,它显示了使用临时和文件排序以及使用where和using index
我使用时间+车辆ID列作为索引,我的选择查询是:
select count(1),CONVERT_TZ(time,'+00:00', :offset) as dateOfIncident
from hardBrake
where vehicleId in (vehicleIds)
and time between NOW() - INTERVAL 30 DAY and NOW()
group by day(dateOfIncident )
order by time DESC;
我从java代码传递的偏移字段和车辆ID字段是用户时区和db时区之间的时区差,分别以GMT和客户的车辆ID表示
对于在函数上使用group by的查询,是否可以删除临时和文件排序
我的问题的一个潜在高峰:
我想让客户在其时区的日期方面了解硬刹车事件。作为替代,我可以在java端进行任何更改,而不必在mysql中使用时区 恐怕此查询无法避免临时表。
请参阅此链接: 为GROUP BY使用索引的最重要的先决条件是,所有GROUP BY列都引用同一索引中的属性,并且索引按顺序存储其键 由于查询使用函数
CONVERT_TZ(time,+00:00',:offset)
来获取GROUP BY值,MySql无法从索引中检索这些值,它必须使用函数“动态”计算它们,并且必须将它们存储在临时表中
文件排序也存在同样的问题,
阅读此链接: 在某些情况下,MySQL无法使用索引解析ORDER BY,尽管它仍然使用索引查找与WHERE子句匹配的行。这些案例包括以下内容:
…….
…….
-您有不同的ORDER BY和GROUP BY表达式 查询具有不同的GROUP BY和ORDER BY表达式:
group by day(dateOfIncident )
order by time DESC;
因此MySql不能使用索引,并且必须使用文件排序。为什么您要按
事件日期
分组,而不是按时间
?如果我按时间分组,那么我将按db时区(即GMT)分组结果,但我想根据用户时区对其进行分组,该时区偏移了我传递的代码。我明白了-因此有可能本地时间和用户时间可能会重叠不同的日期。是的,可能会重叠,但我们仍然必须主要处理PST时区的用户,也可能有其他时区的用户。即使删除订单也没有帮助,我认为使用day功能进行分组是造成问题的原因。