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功能进行分组是造成问题的原因。