select * from delivery_zones where
ST_Contains(zone, POINT(latitude,longitude))
and restaurant_id = 100228 and
(
(weekdays & 16 or weekdays is null)
and (
(hour_starts_at is null and hour_ends_at is null)
or (hour_starts_at is null and hour_ends_at >= ‘13:15:00’)
or (hour_starts_at <= ‘13:15:00’ and hour_ends_at is null)
or (‘13:15:00’ BETWEEN hour_starts_at AND hour_ends_at)
)
and (
(starts_at is null and ends_at is null)
or (starts_at is null and ends_at >= ‘2018-09-21 13:15:00’)
or (starts_at <= ‘2018-09-21 13:15:00’ and ends_at is null)
or (‘2018-09-21 13:15:00’ BETWEEN starts_at AND ends_at)
)
)
and active = 1
and delivery_zones.deleted_at is null
order by layer asc;
(i’ve replaced the real latitude and longitude when posting here, for privacy)
I would like to avoid the resulting filesort
this is the explain:
1,SIMPLE,delivery_zones,range,zone,active,weekdays,restaurant_id,deleted_at,hours,starts_ends,zone,34,1,69.93,Using where; Using filesort
There is also another query called tons of time in a row (about 700-800 times per access) but it doesn’t result in slow log, and I don’t know why, probably it’s already optimized