Этот запрос очень медленный, и я ищу способ оптимизации.
Есть идеи?
select *,
(rating / (select max(rating) from products)) rk_rating, (reviews /
(select max(reviews) from products)) rk_reviews,
(if(label = "", 0, 1)) rk_label,
(1 - price / (select max(price) from products)) rk_price
from 'products'
where ('locale' = 'it' or 'locale' = '*')
and 'id' in (select 'product_id'
from 'location_product'
where 'location_product'.'location_id' in (select 'id'
from 'locations'
where 'place_id' = 'ChIJdd4hrwug2EcRmSrV3Vo6llI' or 'city_place_id' = 'ChIJdd4hrwug2EcRmSrV3Vo6llI'))
order by (rk_rating * '2' + rk_reviews * '5' + rk_label * '0.5' + rk_price * '50') desc limit 21 offset
От 3,7 с до 0,1 с более 1,300 тыс. Рядов, с этими шагами:
products.locale
, products.rating
, products.reviews
и products.price
locations.place_id
и locations.city_place_id
Магия случилась.
select ..., (rk_rating * 2 + rk_label * 0.5 + rk_price * 50) rk_order from ..... order by rk_order desc limit 21 offset