SQL 查询占用 100% CPU - Mariadb
SQL Query takes 100% CPU - Maria DB
我们已将所有 GTFS 架构转换为 Maria DB tables。
https://developers.google.com/transit/gtfs/examples/gtfs-feed
所以我们有 table
- 停止
- 旅行
- 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;
但是,当我 运行 这个查询每次停止在不同的 table 中填充一次以稍后使用结果集时,不幸的是 CPU 使用率达到 100%
不知道为什么,先谢谢了。
IN ( SELECT ... )
,取决于 MySQL/MariaDB 的版本可能优化得非常差(即 CPU)。试着把它变成 JOIN
.
AND t2.stop_sequence > t1.stop_sequence
闻起来像最糟糕的做法 "groupwise-max"。那是它的一部分吗?它是 O(N*N)。有更快的方法。我发现最快的是这里。根据您的要求,它可以是 O(N) 或更好。
FROM ( SELECT ... ) JOIN ( SELECT ... )
也可能优化得非常糟糕——'derived table' 都没有索引,因此您将进行多次 table 扫描(即 CPU)。让我们看看 EXPLAIN SELECT ...
,看看它是否在派生的 table 之一上显示 All
。要解决此问题,请考虑将子查询之一创建为 TEMPORARY TABLE
和 ,提供 suitable 索引。
并且,如前所述,如果您使用的是 MariaDB 10.2,请考虑使用 Windowing and/or CTE 技术完全重写整个查询。
我们已将所有 GTFS 架构转换为 Maria DB tables。
https://developers.google.com/transit/gtfs/examples/gtfs-feed
所以我们有 table - 停止 - 旅行 - 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;
但是,当我 运行 这个查询每次停止在不同的 table 中填充一次以稍后使用结果集时,不幸的是 CPU 使用率达到 100%
不知道为什么,先谢谢了。
IN ( SELECT ... )
,取决于 MySQL/MariaDB 的版本可能优化得非常差(即 CPU)。试着把它变成 JOIN
.
AND t2.stop_sequence > t1.stop_sequence
闻起来像最糟糕的做法 "groupwise-max"。那是它的一部分吗?它是 O(N*N)。有更快的方法。我发现最快的是这里。根据您的要求,它可以是 O(N) 或更好。
FROM ( SELECT ... ) JOIN ( SELECT ... )
也可能优化得非常糟糕——'derived table' 都没有索引,因此您将进行多次 table 扫描(即 CPU)。让我们看看 EXPLAIN SELECT ...
,看看它是否在派生的 table 之一上显示 All
。要解决此问题,请考虑将子查询之一创建为 TEMPORARY TABLE
和 ,提供 suitable 索引。
并且,如前所述,如果您使用的是 MariaDB 10.2,请考虑使用 Windowing and/or CTE 技术完全重写整个查询。