0

这个查询很慢,我正在寻找一种优化的方法。

有任何想法吗?

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 
4

1 回答 1

1

从 3.7 秒到 0.1 秒,超过 1.300.000 行,步骤如下:

  • products.locale在、products.ratingproducts.reviews上添加索引products.price
  • locations.place_id在和上添加索引locations.city_place_id

魔术发生了。

于 2018-09-12T16:30:51.813 回答