powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Как можно усовершенствовать запрос?
25 сообщений из 27, страница 1 из 2
Как можно усовершенствовать запрос?
    #39943821
shtrihs
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день.

Есть достаточно частый запрос в mysql. Его время работы около 120мс. Это много

select distinct `master_id` from (select * from `Master_hist_zakaz` where `id` in ( select max(`id`) as id from `Master_hist_zakaz` where `zakaz_id` in (select `id` from `All_Zakaz` where `date`>='2020-03-21 00:00:00' and `date`<='2020-04-03 23:59:59' and `type_id`='9') group by `zakaz_id`,`master_id`)) t1 where t1.`status_id`=6 or
('9' in (17,18,20,26,58) and t1.`status_id`=16)


explain
1 row=67103 Using where; Using temporary
3 SUBQUERY row 67103 Using temporary; Using filesort
3 SUBQUERY All_Zakaz тут всё ок


Как можно увеличить его скорость? Проблема в том, что в Master_hist_zakaz много записей, а в запросе он не ограничивается, ничем кроме id из All_Zakaz .
index в Master_hist_zakaz по zakaz_id есть.

Может надо связку индекса между All_Zakaz и Master_hist_zakaz сделать? Помогает это? Один ко многим например.
...
Рейтинг: 0 / 0
Как можно усовершенствовать запрос?
    #39943822
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
shtrihs,

Версия MySQL?
...
Рейтинг: 0 / 0
Как можно усовершенствовать запрос?
    #39943824
shtrihs
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
5.7.21
...
Рейтинг: 0 / 0
Как можно усовершенствовать запрос?
    #39943829
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если форматнуть запрос
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
select distinct `master_id` 
from ( select * 
       from `Master_hist_zakaz` 
       where `id` in ( select max(`id`) as id 
                       from `Master_hist_zakaz` 
                       where `zakaz_id` in ( select `id` 
                                             from `All_Zakaz` 
                                             where `date`>='2020-03-21 00:00:00' 
                                               and `date`<='2020-04-03 23:59:59' 
                                               and `type_id`='9' 
                                           ) 
                       group by `zakaz_id`,`master_id` 
                     )
      ) t1 
where t1.`status_id`=6 
   or (    '9' in (17,18,20,26,58) 
       and t1.`status_id`=16 )


то сходу бросается в глаза странное условие '9' in (17,18,20,26,58) .

А так - в принципе аккуратненько преобразовываем WHERE .. IN в соотв. JOIN.
...
Рейтинг: 0 / 0
Как можно усовершенствовать запрос?
    #39943843
shtrihs
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Akina

то сходу бросается в глаза странное условие '9' in (17,18,20,26,58) .


Ну это хитрое условие, оно ни как не влияет на скорость запроса.[/quot]


Akina

А так - в принципе аккуратненько преобразовываем WHERE .. IN в соотв. JOIN.


Я join последнее время сколько не пробовал раз делать, всё равно скорость одинаковая или даже хуже. Правда этот запрос не пробовал, но думаю результат +-5мс. Вроде бы join не сильно увеличивает скорость, по сравнению с WHERE IN. Или я не прав?
...
Рейтинг: 0 / 0
Как можно усовершенствовать запрос?
    #39943844
shtrihs
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Akina,

Код: sql
1.
[color=red]( select max(`id`) as id from `Master_hist_zakaz` where `zakaz_id` in ( select `id` from `All_Zakaz` where `date`>='2020-03-21 00:00:00' and `date`<='2020-04-03 23:59:59' and `type_id`='9' ) group by `zakaz_id`,`master_id` )[/color]



Вот это самый долгий подзапрос, он занимает больше всего времени.
...
Рейтинг: 0 / 0
Как можно усовершенствовать запрос?
    #39943847
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Давайте начнём тогда с публикации DDL этих таблиц и статистики по их наполнению в разрезе условий отбора.
...
Рейтинг: 0 / 0
Как можно усовершенствовать запрос?
    #39943849
shtrihs
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Akina,

Код: sql
1.
2.
3.
4.
5.
6.
select max(t2.`zakaz_id`)
from `All_Zakaz` t1 
JOIN `Master_hist_zakaz` t2 
  on t1.`id`=t2.`zakaz_id` 
where t1.`date`>='2020-03-21 00:00:00' and t1.`date`<='2020-04-03 23:59:59' and t1.`type_id`='9' 
group by t2.`zakaz_id`,t2.`master_id`



Вот подзапрос с join. Результат один в один по скорости
...
Рейтинг: 0 / 0
Как можно усовершенствовать запрос?
    #39943851
shtrihs
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Akina
Давайте начнём тогда с публикации DDL этих таблиц и статистики по их наполнению в разрезе условий отбора.


Никогда это не делал. Подскажите, как это вывести правильно?
...
Рейтинг: 0 / 0
Как можно усовершенствовать запрос?
    #39943853
shtrihs
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Akina,

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
CREATE TABLE `Master_hist_zakaz` (
  `id` int(100) NOT NULL,
  `master_id` varchar(4000) NOT NULL,
  `zakaz_id` varchar(4000) NOT NULL,
  `status_id` varchar(4000) NOT NULL,
  `date` datetime NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;


--
-- Indexes for table `Master_hist_zakaz`
--
ALTER TABLE `Master_hist_zakaz`
  ADD PRIMARY KEY (`id`)
  ADD KEY `zakaz_id` (`zakaz_id`(1024)),
  ADD KEY `date` (`date`);



CREATE TABLE `All_Zakaz` (
  `id` int(11) NOT NULL,

  `master_id` varchar(100) NOT NULL,
  `date` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `type_id` varchar(100) NOT NULL
 ) ENGINE=InnoDB DEFAULT CHARSET=utf8;


ALTER TABLE `All_Zakaz`
  ADD PRIMARY KEY (`id`),
  ADD KEY `date` (`date`)
 



Я так понимаю, это нужно?
...
Рейтинг: 0 / 0
Как можно усовершенствовать запрос?
    #39943855
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Создайте индекс All_Zakaz (type_id, `date`, id) .

Заодно объясните, какого лешего поле type_id , судя по тексту запроса - числовое, имеет тип varchar(100) .
...
Рейтинг: 0 / 0
Как можно усовершенствовать запрос?
    #39943866
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Akina
Заодно объясните, какого лешего поле type_id , судя по тексту запроса - числовое, имеет тип varchar(100) .
Да и остальные %id
...
Рейтинг: 0 / 0
Как можно усовершенствовать запрос?
    #39943885
shtrihs
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Akina
Создайте индекс All_Zakaz (type_id, `date`, id) .



`date`, id - индексы есть. А зачем ещё и type_id? Если создать почти на все поля индексы - это разве правильно?

Akina


Заодно объясните, какого лешего поле type_id , судя по тексту запроса - числовое, имеет тип varchar(100) .


Это сильно увеличивает нагрузку? Увеличивает время выполнения скриптов? Или это просто не правильно?
...
Рейтинг: 0 / 0
Как можно усовершенствовать запрос?
    #39943886
shtrihs
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
miksoft
Да и остальные %id

Когда создавал таблицу, не был уверен, что хватит размера поля int для этих полей
...
Рейтинг: 0 / 0
Как можно усовершенствовать запрос?
    #39943899
shtrihs
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Преобразование в int, помогло увеличить скорость скрипта в три раза. Сейчас время выполнения скрипта 37мс. Но конечно , хотелось бы ещё увеличить
...
Рейтинг: 0 / 0
Как можно усовершенствовать запрос?
    #39943917
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
shtrihs
miksoft
Да и остальные %id

Когда создавал таблицу, не был уверен, что хватит размера поля int для этих полей
Это ж какого размера таблицы, на которых вы миллисекунды ловите?
В крайнем случае можно было бы на bigint перейти, но не на строки.
...
Рейтинг: 0 / 0
Как можно усовершенствовать запрос?
    #39943932
shtrihs
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
miksoft
shtrihs
пропущено...

Когда создавал таблицу, не был уверен, что хватит размера поля int для этих полей
Это ж какого размера таблицы, на которых вы миллисекунды ловите?
В крайнем случае можно было бы на bigint перейти, но не на строки.


Размер таблиц около 30 тыщ записей
...
Рейтинг: 0 / 0
Как можно усовершенствовать запрос?
    #39943934
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
shtrihs
Akina
Создайте индекс All_Zakaz (type_id, `date`, id) .



`date`, id - индексы есть. А зачем ещё и type_id? Если создать почти на все поля индексы - это разве правильно?
Правильно создавать те индексы, которые ускоряют те запросы, которые нужно ускорить.
И индексы на отдельные поля - это совсем не то же самое, что один индекс на несколько полей.

Тоже предлагают создать индекс All_Zakaz (type_id, `date`, id) либо All_Zakaz (type_id, `date`) - не помню с какой версии MySQL умеет читать первичный ключ из индекса как данные.
После создания индекса имеет смысл сделать OPTIMIZE TABLE для всех таблиц в запросе.
...
Рейтинг: 0 / 0
Как можно усовершенствовать запрос?
    #39944002
shtrihs
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
[quot miksoft#22111149]
shtrihs
пропущено...



Тоже предлагают создать индекс All_Zakaz (type_id, `date`, id) либо All_Zakaz (type_id, `date`) - не помню с какой версии MySQL умеет читать первичный ключ из индекса как данные.
После создания индекса имеет смысл сделать OPTIMIZE TABLE для всех таблиц в запросе.


То есть можно хоть на большинство полей поставить индекс? Но ведь вроде бы , количество индексов увеличивает время insert.

А Primary Key ведь заменяет индекс? Или надо Promary key+index делать?
...
Рейтинг: 0 / 0
Как можно усовершенствовать запрос?
    #39944007
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
По-моему, Вы не понимаете, что
Akina
Создайте индекс All_Zakaz (type_id, `date`, id) .
это создать ОДИН индекс, а не три...
...
Рейтинг: 0 / 0
Как можно усовершенствовать запрос?
    #39944011
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
shtrihs
Но ведь вроде бы , количество индексов увеличивает время insert.
Верно, увеличивает. Поэтому индексы нужно создавать только те, которые нужны в вашей конкретной ситуации для ваших конкретных запросов.
...
Рейтинг: 0 / 0
Как можно усовершенствовать запрос?
    #39944031
shtrihs
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
miksoft,

то есть, сам запрос оптимизировать нельзя больше?
...
Рейтинг: 0 / 0
Как можно усовершенствовать запрос?
    #39944041
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
shtrihs
miksoft,

то есть, сам запрос оптимизировать нельзя больше?
Почему же?
Вы попробовали вариант с индексом?

Еще можно убрать один внешний уровень вложенности. Быстрее, может, и не станет, но хоть читабельность увеличится.

SELECT * лучше заменить только на необходимые поля.

DISTINCT точно нужен?
...
Рейтинг: 0 / 0
Как можно усовершенствовать запрос?
    #39944068
paver
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А замена условия отбора по дате-времени на отбор по дате может дать существенный выигрыш? С добавлением соответствующего поля типа date, конечно.
...
Рейтинг: 0 / 0
Как можно усовершенствовать запрос?
    #39944100
kolobok0
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
shtrihs,

можно оптимизировать получение данных... а вот сам запрос, думаю если да то не существенно уже - тут вроде основные моменты изложили...

(круглый)
...
Рейтинг: 0 / 0
25 сообщений из 27, страница 1 из 2
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Как можно усовершенствовать запрос?
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]