Почему два mysql выбора, выполняемые отдельно, намного быстрее, чем один, объединенный? - PullRequest
0 голосов
/ 17 апреля 2020

Я хочу понять случай, когда я запускаю два запроса по отдельности, в общей сложности это занимает около 400 мс, но когда я их объединяю с помощью суб-выбора, это занимает около 12 секунд. У меня есть две таблицы InnoDB:

  • событие: 99 914 строк
  • 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? Есть ли лучший способ создать один запрос для этого случая?

1 Ответ

0 голосов
/ 17 апреля 2020

Вы можете использовать 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

Убедитесь, что вы используете

  • a PRIMARY KEY на event.id
  • a PRIMARY KEY on event_prizes.id
  • a FOREIGN KEY on event_prizes.event_id

Вы также можете попробовать следующие индексы как минимум:

  • event(status)
...