Эта группа транспонирования MySQL по запросу оптимизируется? - PullRequest
0 голосов
/ 25 марта 2019

my_table содержит 290M строк, и я хочу оптимизировать следующий запрос

select
  col1,
  col2,
  group_concat(distinct case when col3=1 then col4 end) c1,
  group_concat(distinct case when col3=2 then col4 end) c2,
  ...
  group_concat(distinct case when col3=70 then col4 end) c70
from my_table
group by col1,col2
order by null

Я уже пытался выполнить меньшие запросы, подобные этому, но в целом все хуже

select
  col1,
  col2,
  group_concat(distinct case when col3=1 then col4 end) c1
from my_table
group by col1,col2
order by null

Есть лиспособ сделать это?

Ответы [ 2 ]

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

(Пожалуйста, используйте настоящие имена столбцов; часто там есть полезные подсказки.)

Может быть это будет быстрее ...

Во-первых, давайте посмотрим, как быстро можно выполнить все GROUP_CONCATs одновременно:

SELECT col3,
       GROUP_CONCAT(DISTINCT col4) AS list
    FROM my_table
    GROUP BY col3;

Это займет полное сканирование таблицы (290M строк), но его можно ускорить с помощью

INDEX(col3, col4)  -- in this order

что означает «покрытие».

Однако, поскольку у вас col1 и col2 запятнаны работы, давайте изменим на

SELECT col1, col2, col3,
       GROUP_CONCAT(DISTINCT col4) AS list
    FROM my_table
    GROUP BY col1, col3, col3;

и

INDEX(col1, col2, col3, col4)   -- in this order

В этот момент у вас есть все данные, но вам нужно их «развернуть». (См. Тег [pivot].)

0 голосов
/ 25 марта 2019

Это сложный вопрос, потому что вы запрашиваете только одну таблицу.Я могу предложить следующий индекс:

CREATE INDEX idx ON my_table (col1, col2, col3, col4);

MySQL может выбрать использование этого индекса на том основании, что для каждой группы (col1, col2) он может выполнить сканирование индекса, чтобы найти каждое значениеcol3, а затем объединить различные значения col4.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...