我们已将所有GTFS架构转换为Maria DB表。
https://developers.google.com/transit/gtfs/examples/gtfs-feed
所以我们有像这样的表 - 停 - 旅行 - stop_time - 等等
然后我们有一个SQL查询来查找当前停止后的所有停靠点,因此我们使用以下查询
SELECT DISTINCT t2.stop_id
FROM (SELECT stop_id,
trip_id,
stop_sequence
FROM stop_time
WHERE stop_id IN :stopIds) t1
inner join (SELECT stop_id,
trip_id,
stop_headsign,
stop_sequence
FROM stop_time
WHERE trip_id IN (SELECT trip_id
FROM stop_time
WHERE stop_id IN :stopIds)) t2
ON t2.trip_id = t1.trip_id
AND t2.stop_sequence > t1.stop_sequence;
但是,当我为每个停止运行此查询以在其他表中填充一次以便稍后使用结果集时,不幸的是CPU使用率达到100%
我不确定为什么,谢谢你。
答案 0 :(得分:1)
IN ( SELECT ... )
,取决于MySQL / MariaDB的版本可能极差(即CPU)。尝试将其变为JOIN
。
AND t2.stop_sequence > t1.stop_sequence
闻起来像是最糟糕的做法" groupwise-max"。那是它的一部分吗?它是O(N * N)。有更快的方法。我找到的最快的是 here 。根据您的要求,它可以是O(N)或更好。
FROM ( SELECT ... ) JOIN ( SELECT ... )
也可能会非常糟糕地进行优化 - 这两个表格都没有得到优势。有索引,所以你会有多个表扫描(即CPU)。让我们看看EXPLAIN SELECT ...
是否在其中一个派生表上显示All
。要解决此问题,请考虑将其中一个子查询创建为TEMPORARY TABLE
和,以提供合适的索引。
如前所述,如果您使用的是MariaDB 10.2,请考虑使用Windowing和/或CTE技术完全重写整个查询。