mysql - SQL 查询占用 100% CPU - Mariadb

标签 mysql mariadb gtfs

我们已将所有 GTFS 架构转换为 Maria DB 表。

https://developers.google.com/transit/gtfs/examples/gtfs-feed

所以我们有这样的表格 - 停止 - 旅行 - 停止时间 - 等等

然后我们有一个 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%

我不知道为什么,提前谢谢。

最佳答案

IN ( SELECT ... ),根据 MySQL/MariaDB 的版本,优化效果可能极差(即 CPU)。尝试将其变成JOIN

AND t2.stop_sequence > t1.stop_sequence 闻起来像是执行“groupwise-max”的最糟糕方法。这是它的一部分吗?是 O(N*N)。还有更快的方法。我发现的最快的在这里。根据您的要求,它可以是 O(N) 或更好。

FROM ( SELECT ... ) JOIN ( SELECT ... ) 也可能优化得非常糟糕——“派生表”都没有索引,所以你将会有多个表扫描(即, 中央处理器)。让我们看看EXPLAIN SELECT ...,看看它是否在派生表之一上显示All。要修复此问题,请考虑将子查询之一创建为TEMPORARY TABLE提供合适的索引。

而且,正如已经提到的,如果您使用的是 MariaDB 10.2,请考虑使用窗口和/或 CTE 技术完全重写整个查询。

关于mysql - SQL 查询占用 100% CPU - Mariadb,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46597686/

相关文章:

java - 空关系表

database - AWS RDS MariaDB 在简单的更改表上无缘无故地消耗了 300GB

gps - 我需要建议为具有大量相关信息的项目选择 NoSQL 数据库

PHP preg_replace 与 SQL

mysql - 从 MySQL 到 MariaDB 的 mysql 查询问题

mysql - 如何根据行在表格中出现的次数来选择行?

mysql - 如何使用 GTFS 列出从一站到另一站的所有行程?

mysql - 间接路由的 GTFS SQL 查询

mysql - 替换 MySQL 数据库中数据库字段中的字符串(URL)

Php PDO 没有更新,不知道为什么