MySQL медленный запрос при использовании GROUP BY - PullRequest
0 голосов
/ 07 февраля 2019

Я использую 2 таблицы для объединения пакетов в отправления:

посылки

CREATE TABLE `packages` (
  `package` int(11) NOT NULL,
  `shipping` int(11) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

ALTER TABLE `packages`
  ADD PRIMARY KEY (`package`,`shipping`);
COMMIT;

отправления

CREATE TABLE `shippings` (
  `id` int(11) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

ALTER TABLE `shippings`
  ADD PRIMARY KEY (`id`);

ALTER TABLE `shippings`
  MODIFY `id` int(11) NOT NULL AUTO_INCREMENT;COMMIT;

проблема заключается в том, что я пытаюсь присоединить пакеты к отправкам и GROUP BY, например, для подсчета пакетов в каждой доставке:

SELECT s.id,COUNT(*) packages
FROM shippings s
INNER JOIN packages p ON s.id=p.shipping
GROUP BY s.id

с отправками 5K и 10K записывает записи запросавыполнение более 10 секунд, может быть, мне не хватает некоторых ключей или индексов?

Ответы [ 2 ]

0 голосов
/ 08 февраля 2019
SELECT s.id,COUNT(*) packages
FROM shippings s
INNER JOIN packages p ON s.id=p.shipping
GROUP BY s.id

можно упростить до

SELECT p.shipping AS id,
       COUNT(*) AS packages
FROM packages p
GROUP BY p.shipping

Оттуда вам нужен индекс , начинающийся с shipping.Вы можете изменить порядок столбцов в ПК или добавить INDEX(shipping).

0 голосов
/ 07 февраля 2019

Возможно, вы захотите добавить индекс для packages.shipping.Индекс первичного ключа, который у вас есть, не будет использоваться в запросе, поскольку он имеет пакет в качестве первого уровня.

В качестве альтернативы вы можете изменить порядок столбцов первичного ключа в таблице пакетов, но это зависит от того, какие другие запросы используют таблицу.

...