美文网首页
索引优化实战

索引优化实战

作者: sizuoyi00 | 来源:发表于2019-09-26 00:28 被阅读0次

    优化步骤

    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;

    优化后

    如二次优化可使用覆盖索引等小技巧

    相关文章

      网友评论

          本文标题:索引优化实战

          本文链接:https://www.haomeiwen.com/subject/uwxructx.html