问题描述
我有以下查询:
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
这是我的解释性声明:
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)