我有以下查询:
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.20
docker 容器,没有任何我知道的额外配置......
编辑 2
它看起来不像是缓存的东西。删除并重新创建数据库,然后插入新的(随机)值,然后使用 Sequel Pro 进行第一次查询会导致大约 30 毫秒的响应。