【问题标题】:SQL Query takes 100% CPU - Maria DBSQL 查询占用 100% CPU - Mariadb
【发布时间】:2017-10-09 01:10:45
【问题描述】:

我们已将所有 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%

我不知道为什么,在此先感谢。

【问题讨论】:

  • 这里有大量的连接,所以如果你有很多记录,这可能需要处理数十亿行数据。
  • 为什么不提供一些sample dataexpected result(参见stackoverflow.com/help/mcve也许你现在正在使用 LEAD() OVER(),因为你正在使用 Mariadb
  • @tadman 有什么优化查询的建议吗?
  • @Used_By_Already...将尝试提供示例数据
  • @SumitVairagar 我不确定 MySQL 是否是完成这项工作的最佳工具。看起来您需要一个更加面向图形的数据库。

标签: mysql mariadb gtfs


【解决方案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 技术完全重写整个查询。

【讨论】:

    猜你喜欢
    • 2012-12-29
    • 1970-01-01
    • 1970-01-01
    • 2022-12-15
    • 1970-01-01
    • 1970-01-01
    • 2011-11-09
    • 2021-07-07
    • 2012-03-10
    相关资源
    最近更新 更多