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
一往无前虎山行,拨开云雾见光明

浙公网安备 33010602011771号