1
回答
关于MySQL联表查询的优化问题
极速云服务器,低至1.04元/天>>>   

需要前提是:

有三张表,

设备表 device_info
商品表 store_goods
类别预警表 store_goods_category_threshold

需要场景是这样的,

我需要查询某个设备下的商品的库存有低于库存预警的,

先查找商品表里的stock_threshold 字段,如果大于0则用这个字段筛选

否则查找类别预警表的threshold 字段,如果大于-1则用这个字符筛选,这条数据可能为空(用户没设置)

否则查找设备表的stockTrigger .

我的写法是这样的:

SELECT `store_goods`.*
FROM `store_goods` 	INNER JOIN `device_info` ON `store_goods`.`store_id` = `device_info`.`id`
	LEFT JOIN `store_goods_category_threshold` ON `store_goods`.`category_id` = `store_goods_category_threshold`.`cid`
		AND `store_goods`.`store_id` = `store_goods_category_threshold`.`store_id`
WHERE `store_goods`.`store_id` = '2922'
	AND `state` = '200'
	AND stock - CASE WHEN stock_threshold > 0 THEN stock_threshold WHEN store_goods_category_threshold.threshold
	AND store_goods_category_threshold.threshold > -1 THEN threshold ELSE device_info.stockTrigger END <= 0
ORDER BY `store_goods`.`id` DESC
LIMIT 0, 1 

这样出现的慢查询的情况,平均查询要2-3秒.

阿里云给出的建议是:

语句优化建议:
1. 查询条件 stock - CASE WHEN stock_threshold > 0 THEN stock_threshold WHEN store_goods_category_threshold.threshold AND store_goods_category_threshold.threshold > -1 THEN threshold ELSE device_info.stockTrigger END <= 0 无法有效利用索引

请教下要怎样优化这条语句呢?

举报
Geomen
发帖于2个月前 1回/67阅
顶部