Mysql之sql语句优化

1.  联查四个表,还有where过滤条件,最后一个group by

SELECT
	p.`product_id`
FROM
	gt_products p
LEFT JOIN gt_goods goods ON p.`goods_id` = goods.`goods_id`
LEFT JOIN gt_provider provider ON p.provider_id = provider.provider_id
LEFT JOIN gt_product_spec sku ON sku.product_id = p.product_id
WHERE
	p.is_check = 1
AND (
	p.is_stop = 0
	OR p.is_stop IS NULL
)
AND (
	goods.channel = 1
	OR p.provider_id IN (34, 836)
)
GROUP BY
	p.product_id

    分析当前sql的执行计划,如下:     

      

      它默认走的是is_check_2这个索引,这个索引是where条件列的索引,没有走groupby p.product_id的索引,所以Extra产生了using temporary, using filesort,查询时间7s

      如果要消除using temporary, using filesort,需要在p.product_id上建立索引,并走强制索引,查询时间3s

2.  联查一个表,有where过滤条件,还有group by分组

SELECT
	p.product_id,
	p. STATUS,
	sum(s.stock - s.fix_stock) AS available_stock
FROM
	gt_products p 
JOIN gt_product_spec s ON p.product_id = s.product_id
WHERE
	p.is_stop = 0
AND p.is_check = 1
AND p. STATUS IN (0, 1)
AND p.provider_id > 0
GROUP BY
	p.product_id;

    分析当前sql,如下:      

      

      默认走的是is_check_2这个索引,这个索引是where条件列的索引,没有走groupby p.product_id的索引,所以Extra产生了using temporary, using filesort,查询时间17s

      如果要消除using temporary, using filesort,需要在p.product_id上建立索引,并走强制索引,查询时间7s

              

  

 

      

posted @ 2023-06-14 14:50  奋斗史  阅读(11)  评论(0)    收藏  举报