Оптимизация индекса на просмотр объединенной таблицы в MySQL - PullRequest
0 голосов
/ 07 мая 2018

У меня есть запрос на соединение для 2 таблиц:

схема table1

| k | m | y | s | c | h |

схема table2

| k | l | h |

Это мой MySQL запрос:

SELECT l,m,y,sum(s)
FROM table1 t1
JOIN table2 t2
on t1.h=t2.h
WHERE t1.c = 405 
AND t2.l in (500)
GROUP BY m,y,l;

таблица1 содержит более 130 миллионов строк, а таблица2 - 1 миллион строк. Я создал индексы для 2 таблиц следующим образом:

CREATE  INDEX idx_temp1 ON table1(h,c);
CREATE  INDEX idx_temp2 ON table2(h,l);

Запрос по-прежнему занимает много времени (более 10 минут). Мой вариант использования хочет, чтобы запрос был выполнен за секунду. Скажите, пожалуйста, есть ли какая-либо оптимизация, которая может быть сделана по запросу.

PS: я также пытался создать разделы на c, но не сильно помог с точки зрения производительности.

1 Ответ

0 голосов
/ 07 мая 2018

Для этого запроса:

SELECT t2.l, t1.m, t1.y, sum(t1.s)
FROM table1 t1 JOIN
     table2 t2
     ON t1.h = t2.h
WHERE t1.c = 405 AND t2.l in (500)
GROUP BY t2.l, t1.m, t1.y;

Я бы предложил две стратегии индексации.Предполагая, что условие на t1 является наиболее ограничительным, попробуйте table1(c, h, m, y, s) и table2(h, l).

Если t2 является более ограничительным, то table2(l, h) и table1(h, c, m, y, s).

Обратите внимание, что агрегация займет время, если JOIN возвращает значительное количество строк.Возможно, не удастся получить результат за секунду.Возможно, вам придется прибегнуть к сводной таблице с триггерами для обновления значений.

...