bigton
@bigton
Web-программист

Как ускорить выполнение GROUP BY?

Всем привет!

Есть 700 таблиц по 5М записей, каждая таблица весит по 200Мб.
Структура таблиц следующая:
CREATE TABLE `table` (
  `id` int(11),
  `id2` int(11),
  `id3` int(11),  
  `p1` int(11),
  `p2` int(11),
  KEY `id` (`id`)
) ENGINE=MyISAM;


К каждой из этих таблиц применяется следующий запрос:
SELECT `id1`, `id2`, `id3`, `p1`, COUNT(`p1`) AS `count`, `p2` 
FROM `table` 
GROUP BY `id1`, `id3`, `p1`, `p2`


Результат запроса отправляется INSERT'ом в другую специальную таблицу.

Проблема заключается во времени исполнения запроса, пример 200 сек. Таким образом на обработку всех 700 таблиц мне понадобиться 38 часов. Хотелось бы сократить это время до 1-3 часов.

Вопрос: есть ли способы уменьшить время запроса?

Предпринятые меры:
1. Чтобы трафик результатов запросов не гонять между серверами, php-скрипт разместил на сервере БД.

ЗАДАЧА РЕШЕНА
Всем спасибо за участие, воспользовался функцией GROUP_CONCAT(), что уменьшило время выборки 4 секунд.
  • Вопрос задан
  • 3999 просмотров
Пригласить эксперта
Ответы на вопрос 6
@Nc_Soft
Индексов нет?! Покажите explain запроса.
Ответ написан
Комментировать
Kwisatz
@Kwisatz
Больше web-приложений, хороших и разных
Такой запрос к таблице применяться не может, у вас в селекте есть поля не участвующие в группировки и без применения агрегатных функций.
Покажите explain запроса и show create таблицы.

Судя по времени выполнения отсутствуют или неправильно расставлены индексы. Таблицы без шардирования?

ЗЫ Если не хотите публично светить данными то можно и лично, но уже в разрезе оплачиваемой работы.
Ответ написан
gbg
@gbg
Любые ответы на любые вопросы
Посмотрите план запроса, добавьте недостающие индексы.
Ответ написан
thewind
@thewind
php программист, front / backend developer
Неужели структура данных не позволяет все эти 700 таблиц свести в одну, добавив несколько полей при надобности с доп. критериями? Это же просто ужас, так проектировать БД. Да и вдруг понадобится обновить структуру данных (читай "таблиц") и тогда надо в каждой из 700 таблиц добавить / удалить столбец?
Ответ написан
Slavenin999
@Slavenin999
программист php/erlang/elixir/js
Попробуйте запустить mysqltuner.pl и посмотреть его рекомендации по настройке mysql. Индекс пробовали по всем полям (`id1`, `id3`, `p1`, `p2`)?
Ответ написан
Комментировать
Не могли бы вы словами объяснить, что должен сделать запрос? Тот запрос, что вы написали, не имеет смысла.
Если нужно получить количество уникальных сочетаний (id1, id2, id3, p2), то попробуйте такой запрос:
SELECT `id1`, `id2`, `id3`, COUNT(*) AS `count`, `p2` 
FROM `table` 
GROUP BY `id1`, `id2`, `id3`, `p2`
ORDER BY NULL

Если p2 объявлен как NOT NULL, то должно работать достаточно быстро.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы