【发布时间】:2020-07-30 14:41:25
【问题描述】:
我想了解当我分别运行两个查询时总共需要大约 400 毫秒的情况,但是当我使用子选择将它们组合起来时大约需要 12 秒。 我有两个 InnoDB 表:
- 事件:99914 行
- even_prizes:24 540 770 行
以下是我的疑问:
SELECT
id
FROM
event e
WHERE
e.status != 'SCHEDULED';
-- takes 130ms, returns 2406 rows
SELECT
id, count(*)
FROM
event_prizes
WHERE event_id in (
-- 2406 ids returned from the previous query
)
GROUP BY
id;
-- takes 270ms, returns the same amount of rows
当我从下面运行查询时,从另一边:
SELECT
id, count(*)
FROM
event_prizes
WHERE event_id in (
SELECT
id
FROM
event e
WHERE
e.status != 'SCHEDULED'
)
GROUP BY
id;
-- takes 12seconds
我猜在第二种情况下 MySQL 会对 event_prizes 表进行全扫描? 有没有更好的方法来为这种情况创建单个查询?
【问题讨论】:
-
与所有相关表的 SHOW CREATE TABLE 语句一样,关于查询性能的问题总是需要对给定查询的 EXPLAIN
-
请将 cmets 签入:stackoverflow.com/questions/5018284/…
标签: mysql performance innodb