使用CTE在时间戳查询上创建索引

问题描述

我有以下查询:

WITH cte1 AS
(
    SELECT
        g.id,g.IMEI,Timestamp,GPS_Latitude,GPS_Longitude,CASE WHEN GPS_Speed > 0 THEN 1 ELSE 0 END IO_Engine,IO_Kilometers,IO_Fuel,a.areas_id,CASE 
           WHEN a.type = 'polygon' 
              THEN ST_CONTAINS(
                      ST_GEOMFROMTEXT(concat('POLYGON((',a.coords,'))'),4326),ST_GEOMFROMTEXT(concat("POINT("," ",")"),4326)) 
              ELSE 
                 CASE WHEN
                      ST_Distance(ST_GeomFromText(concat('POINT(',')'),ST_GeomFromText(concat('POINT(',SPLIT_STRING(a.coords,',1),4326)) <= cast(SPLIT_STRING(a.coords,2) as float) 
                                       then 1 else 0 end 
                 end is_in_or_out
       from GPSRecords3 g join areas a on g.imei=a.imei  
       where a.imei='352093081706706' and 
             date(timestamp)='2020-08-7' and 
             timestamp >= '2020-08-7 7:00' and 
             timestamp<= '2020-08-7 19:00' and 
             a.areas_id in(22,23,24,25,26,27)),cte2 AS (SELECT timestamp,areas_id,IO_Engine,is_in_or_out,CAST(ROW_NUMBER() OVER (PARTITION BY areas_id ORDER BY timestamp ASC) AS SIGNED)
                 -CAST(ROW_NUMBER() OVER (PARTITION BY areas_id ORDER BY is_in_or_out,timestamp ASC) AS  SIGNED) AS grp
         FROM cte1 a
)
SELECT 
    b.areas_id,ANY_VALUE(b.is_in_or_out) is_in_or_out,MIN(b.timestamp) starttime,MAX(b.timestamp) endtime,MAX(IO_Kilometers) endkm,MIN(IO_Kilometers) startkm,MAX(IO_Fuel) endfuel,MIN(IO_Fuel) startfuel
FROM 
    cte2 b
GROUP BY 
    areas_id,grp
ORDER BY 
    starttime,areas_id ;

为了使查询运行更快,我为GPSRecords3创建了一个索引:

 ALTER TABLE GPSRecords3 
     ADD INDEX ix_ts2 ((date(Timestamp)) ASC,imei) USING BTREE;

和表区域的索引:

 ALTER TABLE areas 
     ADD INDEX ix_imeicoord (imei) USING BTREE;

我的问题是还有其他方法可以使此查询运行得更快吗?我还需要创建其他索引吗?

PS。对于4万行,大约需要5秒钟。

编辑1

这是我的解释性声明:

enter image description here

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)