优化步骤
1.创建索引
创建索引要注意并不是所有的where条件都要加上索引才会快,过多索引反而会降低查询速度。一般要在最常用的查询条件,order by,group by上加索引。使用一个索引来满足ORDER BY子句,WHERE 条件和 ORDER BY使用相同的索引,并且ORDER BY的顺序和索引顺序相同,并且ORDER BY的字段都是升序或者都是降序。
2.查看级别type代表当前表的级别
possible_keys代表预测使用的索引
key代表实际使用的索引
注意:key在数据量不同的情况会出现变换索引的情况,这时候要充分考虑索引建立的健壮性
3.extra描述
Using temporary; Using filesort
出现上边这两个条件说明该语句必须要优化了,Using temporary 如果有ORDER BY子句和一个不同的GROUP BY子句,或者如果ORDER BY或GROUP BY中的字段都来自其他的表而非连接顺序中的第一个表的话,就会创建一个临时表了。
Using filesort 由于出现了临时表,此时使用order by就相当于一个全表排序。所以sql巨慢。
4.思路
mysql在非直接关联的基础上进行排序会很慢,需要进行优化
1.将主要表作为第一表,将其他表(如果是多表)非直接关联转变成直接关联(合多为一)作为新表
2.多表关联+排序(一大一小两表关联查询情况)
(1)将条件(where,goup by,order by,limit)都转移到主表上,将主表数据查好后,
(2)作为一张数据量很少的新表 再与其他表进行表关联查询
步骤(1)中则使用索引保证索引不失效,步骤(2)则是一张limit后数据量关联一个小表,mysql查询性能完全足够支撑
3.百度Using temporary,Using filesort优化
参考:https://blog.csdn.net/shandalue/article/details/51658920
http://hudeyong926.iteye.com/blog/785181
推荐:https://blog.csdn.net/xiao__gui/article/details/8616224
https://my.oschina.net/longniao/blog/110384
5.实例
主表商品表50w数据,附表品牌表几百数据
优化前查询时间最低为10s+,最高几分钟
优化前explain select g.*,c.store_cat_name from es_goods g
left join es_store_cat c on g.shop_cat_id=c.store_cat_id
where g.seller_id=1 and g.disabled=0 and g.market_enable !=2
and g.goods_type= 'normal' order by g.create_time desc limit 15000,10】
优化后查询时间最低10ms,最高1s
优化后explain select g1.* ,c.store_cat_name from (
select g.* from es_goods g
where g.seller_id=1 and g.disabled=0 and g.market_enable !=2
and g.goods_type='normal' order by g.create_time desc limit 0,10) g1
left join es_store_cat c on g1.shop_cat_id=c.store_cat_id;
如二次优化可使用覆盖索引等小技巧
网友评论