Гость
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Как можно усовершенствовать запрос? / 25 сообщений из 27, страница 1 из 2
04.04.2020, 12:36
    #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
04.04.2020, 12:42
    #39943822
miksoft
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как можно усовершенствовать запрос?
shtrihs,

Версия MySQL?
...
Рейтинг: 0 / 0
04.04.2020, 12:44
    #39943824
shtrihs
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как можно усовершенствовать запрос?
5.7.21
...
Рейтинг: 0 / 0
04.04.2020, 13:02
    #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
04.04.2020, 14:08
    #39943843
shtrihs
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как можно усовершенствовать запрос?
Akina

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


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


Akina

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


Я join последнее время сколько не пробовал раз делать, всё равно скорость одинаковая или даже хуже. Правда этот запрос не пробовал, но думаю результат +-5мс. Вроде бы join не сильно увеличивает скорость, по сравнению с WHERE IN. Или я не прав?
...
Рейтинг: 0 / 0
04.04.2020, 14:11
    #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
04.04.2020, 14:14
    #39943847
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как можно усовершенствовать запрос?
Давайте начнём тогда с публикации DDL этих таблиц и статистики по их наполнению в разрезе условий отбора.
...
Рейтинг: 0 / 0
04.04.2020, 14:17
    #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
04.04.2020, 14:21
    #39943851
shtrihs
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как можно усовершенствовать запрос?
Akina
Давайте начнём тогда с публикации DDL этих таблиц и статистики по их наполнению в разрезе условий отбора.


Никогда это не делал. Подскажите, как это вывести правильно?
...
Рейтинг: 0 / 0
04.04.2020, 14:31
    #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
04.04.2020, 14:38
    #39943855
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как можно усовершенствовать запрос?
Создайте индекс All_Zakaz (type_id, `date`, id) .

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



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

Akina


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


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

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

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

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


Размер таблиц около 30 тыщ записей
...
Рейтинг: 0 / 0
04.04.2020, 17:07
    #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
04.04.2020, 19:55
    #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
04.04.2020, 20:07
    #39944007
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как можно усовершенствовать запрос?
По-моему, Вы не понимаете, что
Akina
Создайте индекс All_Zakaz (type_id, `date`, id) .
это создать ОДИН индекс, а не три...
...
Рейтинг: 0 / 0
04.04.2020, 20:32
    #39944011
miksoft
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как можно усовершенствовать запрос?
shtrihs
Но ведь вроде бы , количество индексов увеличивает время insert.
Верно, увеличивает. Поэтому индексы нужно создавать только те, которые нужны в вашей конкретной ситуации для ваших конкретных запросов.
...
Рейтинг: 0 / 0
04.04.2020, 22:11
    #39944031
shtrihs
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как можно усовершенствовать запрос?
miksoft,

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

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

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

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

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

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

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


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