1

我有以下查询:

SELECT 
    `Job`.`id`, 
    `Job`.`serviceId`, 
    `Job`.`externalId`, 
    `Job`.`createdAt`,
    `Job`.`updatedAt`,
    `logs`.`id` AS `logs.id`,
    `logs`.`statusId` AS `logs.statusId`,
    `logs`.`createdAt` AS `logs.createdAt`
FROM `Jobs` AS `Job` 
LEFT OUTER JOIN (
    SELECT id, jobId, statusId, createdAt, updatedAt
    FROM JobLogs
    WHERE id IN (
        SELECT MAX(id)
        FROM JobLogs
        GROUP BY jobId
    )
) AS `logs` ON `Job`.`id` = `logs`.`jobId`
ORDER BY `Job`.`id` DESC;

它只返回所有Jobs最新的JobLog. 它工作正常,并且在连接到在容器中运行的数据库的 Sequel Pro 中对其进行测试会返回我之前在 +/- 10ms中添加的所有 1000 个作业。

因为我的 API 是在节点中编写的,并且我在后台使用 sequelize/mysql2,所以我刚刚将上述查询复制到一个sequelize.query()片段中(出于测试目的,一个裸机 mysql2-query-snippet 具有相同的结果) - > 查询需要35 秒mysql 进程保持在 100% CPU。

与例如 Sequel Pro 相比,为什么使用 node/mysql2 时查询要慢得多?我在这里想念什么?

这不是LIMIT 1000客户添加的,因为表中只有 1000 个条目...


编辑

$ EXPLAIN <SQL>返回以下内容:

+----+-------------+---------+------------+-------+---------------+---------+---------+-----------+------+----------+--------------------------+
| id | select_type | table   | partitions | type  | possible_keys | key     | key_len | ref       | rows | filtered | Extra                    |
+----+-------------+---------+------------+-------+---------------+---------+---------+-----------+------+----------+--------------------------+
|  1 | PRIMARY     | Job     | NULL       | index | NULL          | PRIMARY | 4       | NULL      | 1000 |   100.00 | NULL                     |
|  1 | PRIMARY     | JobLogs | NULL       | ref   | jobId         | jobId   | 4       | db.Job.id |   13 |   100.00 | Using where              |
|  3 | SUBQUERY    | JobLogs | NULL       | range | jobId         | jobId   | 4       | NULL      | 1000 |   100.00 | Using index for group-by |
+----+-------------+---------+------------+-------+---------------+---------+---------+-----------+------+----------+--------------------------+
3 rows in set, 1 warning (0.00 sec)

而且我正在使用mysql:5.7.20docker 容器,没有任何我知道的额外配置......


编辑 2

它看起来不像是缓存的东西。删除并重新创建数据库,然后插入新的(随机)值,然后使用 Sequel Pro 进行第一次查询会导致大约 30 毫秒的响应。

4

0 回答 0