Есть запрос:
SELECT
AVG(`d`.`x`),
SUM(`d`.`y`)
FROM `data_table` AS `d`
INNER JOIN `group_table` AS `g`
ON `d`.`g_id` = `g`.`id`
WHERE
`d`.`param` = 1
GROUP BY `g`.`group_column`
Он работает медленно, по скольку таблица
group_table
большая (70 тыс), а
data_table
огромная (3 млн записей), это для теста, реальный размер будет в сотни раз больший.
Таблица
group_table
введена с целью оптимизации раздела, так как нужны индексы по
group_column
, которых несколько разных, а данные повторяются, соответственно не хотелось добавлять несколько колонок с индексами для этих миллионов записей.
Но дело в том, что при выборке, когда подходит большое количество записей из
data_table
запрос выполняется 12-18 секунд с использованием быстрого SSD, что неприемлемо.
Вопрос в том, как изменить запрос, чтобы ускорить выборку (нужна группировка по колонкам типа
group_column
). Подходят варианты с изменением структуры БД, используется MariaDB, подходят решения, которые работают только в ней без обратной совместимости с MySQL.
Очень надеюсь на коллективный разум.
UPD структура таблиц из примера:
CREATE TABLE IF NOT EXISTS `data_table` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`x` int(11) NOT NULL,
`y` int(11) NOT NULL,
`param` int(11) NOT NULL,
`g_id` int(11) NOT NULL,
PRIMARY KEY (`id`),
KEY `param` (`param`),
KEY `g_id` (`g_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
CREATE TABLE IF NOT EXISTS `group_table` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`group_column` int(11) NOT NULL,
`group_column2` int(11) NOT NULL,
PRIMARY KEY (`id`),
KEY `group_column` (`group_column`),
KEY `group_column2` (`group_column2`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;