【问题标题】:Why two mysql selects executed separately are much faster than one combined?为什么两个单独执行的 mysql 选择比一个组合要快得多?
【发布时间】: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 表进行全扫描? 有没有更好的方法来为这种情况创建单个查询?

【问题讨论】:

标签: mysql performance innodb


【解决方案1】:

您可以使用INNER JOIN 代替子选择:

SELECT ep.id, COUNT(*) 
FROM event_prizes ep INNER JOIN event e ON ep.event_id = e.id 
WHERE e.status <> 'SCHEDULED'
GROUP BY ep.id

确保您正在使用

  • PRIMARY KEY event.id
  • PRIMARY KEY event_prizes.id
  • FOREIGN KEY event_prizes.event_id

您也可以至少尝试以下索引:

  • event(status)

【讨论】:

  • 但一如既往,关键是索引
  • 我已经尝试过了,得到最终结果大约需要 9 秒 - 仍然无法与 400 毫秒相比 ..
  • @tomgal - 请为每张桌子提供SHOW CREATE TABLE,以便我们深入挖掘。
猜你喜欢
  • 2013-10-16
  • 2018-08-03
  • 2017-03-15
  • 1970-01-01
  • 2018-06-10
  • 2018-06-17
  • 2011-01-19
  • 1970-01-01
  • 2012-05-18
相关资源
最近更新 更多