ProKiLL
@ProKiLL
Системный администратор

Как оптимизировать данный запрос?

Добрый день!
Подскажите как оптимизировать данный MySQL запрос
SELECT registry.id, registry.reg_num, registry.reg_date, registry.Theme, registry.List_doc, registry.List_add, registry.Contractor, registry.type_send, registry.Send_date 
FROM registry INNER JOIN recipients ON recipients.letterId = registry.id 
WHERE registry.reg_date like '2016-12' 
GROUP BY registry.id 
ORDER BY registry.reg_num ASC

Иногда время запроса уходит в 15 секунд - что не есть хорошо

EXPLAIN
+----+-------------+------------+-------+-----------------------+----------+---------+------------------+------+----------------------------------------------+
| id | select_type | table      | type  | possible_keys         | key      | key_len | ref              | rows | Extra                                        |
+----+-------------+------------+-------+-----------------------+----------+---------+------------------+------+----------------------------------------------+
|  1 | SIMPLE      | registry   | index | PRIMARY,LetterId,Date | PRIMARY  | 4       | NULL             |   47 | Using where; Using temporary; Using filesort |
|  1 | SIMPLE      | recipients | ref   | LetterId              | LetterId | 4       | work.registry.id |    1 | Using index                                  |
+----+-------------+------------+-------+-----------------------+----------+---------+------------------+------+----------------------------------------------+

363625c5852c4f9ab7058dd43bc6d255.pngfe65c46c6c9243dcb680a2c1cb2c5b90.png
  • Вопрос задан
  • 130 просмотров
Пригласить эксперта
Ответы на вопрос 2
MaxDukov
@MaxDukov
впишусь в проект как SRE/DevOps.
выкладывайте EXPLAIN запроса - что там у Вас с индексами никто предсказать не может.
пока, на вскидку - LIKE. это без индекса - и это трэш на нормальных объемах. тем более что у вас LIKE не по части строки - нафига он тут вообще?
Ответ написан
@AlikDex
Насколько я понял нужна выборка по месяцу? Как-то так.
SELECT @dt:=EXTRACT(YEAR_MONTH FROM '2016-12-01'); -- Дополнить вашу дату до полного формата
SELECT id, reg_num, reg_date, Theme, List_doc, List_add, Contractor, type_send, Send_date 
FROM registry
WHERE EXTRACT(YEAR_MONTH FROM reg_date) = @dt AND EXISTS(SELECT `letterId` FROM `recipients` WHERE letterId = registry.id LIMIT 1)
ORDER BY reg_num ASC

Поскольку с реципиента вы ничего не выбираете, значит можно проверить просто его существование. Тогда отпадает необходимость в группировке.
и отдельный индекс по reg_num
Также проверить индекс на reg_date Чот судя по експлейну его нет =)
Ответ написан
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы