SELECT p.products_id FROM products AS p
JOIN products_to_categories AS pc USING(products_id)
JOIN categories AS c USING(categories_id)
JOIN products_realtime_quantity AS prq ON prq.sku_or_poa = p.products_model
WHERE products_status =1 AND categories_status =1 AND prq.msg != 'Temporary out stock.'
ORDER BY p.products_date_added DESC LIMIT 10
这是我们一贯的优化方法,但是我们可以根据sql语句的特性和业务特性,结合临时表进行一些淫邪的优化,虽然并不通用,但是可以开阔sql优化者的思维。
我们可以看到这条语句是需要根据产品添加时间拿取符合(products_status =1 AND categories_status =1 AND prq.msg != 'Temporary out stock.')条件的10个最新上架产品.而我们知道,最新上架的产品一般状态都是不可能马上下架,而且对应的类别id也是可用,而且库存也是充足的(要不然何必上架),这个特性站到了99.9%以上.所以,我们利用这个特性,先从产品表中找出不带任何条件的200个产品,放到临时表,然后再用临时表结果集,和拿取条件进行匹配,取出最新的10条.
(200条是一个参考值,根据各自的逻辑特性来取)
sql如下
SELECT DISTINCT p.products_id FROM
(SELECT products_id,products_model,products_status,products_date_added
FROM products
ORDER BY products_date_added DESC LIMIT 200
) AS p
JOIN products_to_categories AS pc USING(products_id)
JOIN categories AS c USING(categories_id)
JOIN products_realtime_quantity AS prq ON prq.sku_or_poa = p.products_model
WHERE products_status =1 AND categories_status =1 AND prq.msg != 'Temporary out stock.'
ORDER BY products_date_added DESC LIMIT 10;