Есть небольшая программка для учета загрузки производства.
Есть небольшая табличка:
1. id: INT - Primary Key
2. id_order: INT - номер заказа
3. date_start - начало производство заказа
4. date_end - конец производства заказа
То есть в таблице записи указывают с какого по какое число будет производится определенный заказ.
Однако производство имеет ограничение - не более 5 заказов в день.
перед добавление нового заказа нужно проверить каждую дату предполгаемого периода чтобы в ней уже не было 5 заказов в производстве.
Если заказов уже 5 в дате - она недоступна для размещения заказа.
Сейчас это делает очень тупо: при добавлении нового заказа с желаемым периодом производства на каждую дату идет запрос с подсчетом количества размещенных заказов: SELECT COUNT(id_order) FROM `calendar` WHERE `date_start`<='2019-09-18' and `date_end`>='2019-09-18'.
Но в ростом таблицы все это стало работать медленно просто до жути даже с учетом индексов.
Можно ли как-то построить один запрос, который сразу бы выводил максимальное кол-во заказов в день в определенный период?
Например: менеджер хочет чтобы его заказ, требующий на изготовление 3 дня изготовили с 18.09.2019 по 25.09.2019.
Как один запросом узнать, если в периоде с 18 по 25 сентября 2019 года хоть один, в котором произвоство уже загружено максимальными 5 заказами в день?
Если есть - то период недоступен для размещения заказа, если нет - то доступен.
Лентюй, надо чтобы заказ производился все дни подряд) я же говорю что я упростил описание процесса) там все намного сложнее( просто надо решить именно такой вопрос
У вас, видимо, накопился архив, и перебирать его в целях поиска места под будущий заказ совершенно незачем. У заказов нет отметки "выполнен", по которой их можно было бы исключить из подобных запросов?
Ну, и 5 заказов в день - это полторы тысячи в год. Совершенно незначительный объем для современной БД, особенно "с учетом индексов". Что-то не так.
я упросил вопрос. на самом деле производство может больше 50 заказов в день брать. А производств несколько.
От этого и идет много записей и все тормозит((
sagrus, все равно стоит максимально исключить из запроса ненужное.
Если у вас постоянно требуется делать именно такие расчеты - в конце концов, можно завести индексированную таблицу с записями id заказа - дата на каждый день каждого заказа. И чистить ее по мере наступления этих дней.
Если выложите что-то более реальное и проблемное - может быть, по нему вам укажут на более реальные возможности оптимизации. Схема таблиц, запрос, explain этого запроса...