• SQL优化


    1:SQL优化

    1.1 MySql优化

    1.1.2 ICP(index condition pushdown)

    自MySQL5.6引入的优化方式,只能用于二级索引(secondary index)。

    优化前:当进行索引查询时,首先根据索引查询记录(Storage Engine),然后再根据WHERE条件来进行过滤(server)记录。

    优化后:Mysql数据在取出索引同时,判断是否可以进行WHERE条件的过滤,即将过滤放置于Storage Engine进行。

    1.1.2:MRR(Multi-Range Read)

    MySQL 5.6版本提供了很多性能优化的特性,其中之一就是 Multi-Range Read 多范围读(MRR) , 它的作用针对基于辅助/第二索引的查询,减少随机IO,并且将随机IO转化为顺序IO,提高查询效率。

    开启之前:

    开启之后:

    MySQL 将根据辅助索引获取的结果集根据主键进行排序,将乱序化为有序,可以用主键顺序访问基表,将随机读转化为顺序读,多页数据记录可一次性读入或根据此次的主键范围分次读入,以减少IO操作,提高查询效率。

    主键顺序读取,减少缓冲池中页被替换的次数,批量处理对键值对的查询操作。

    1.2 SQL优化

    • 1、通过慢查日志等定位那些执行效率较低的SQL语句

    • 2、explain 分析SQL的执行计划

    1.2.1 使用覆盖索引

    当sql语句的所求查询字段(select列)和查询条件字段(where子句)全都包含在一个索引中(联合索引),可以直接使用索引查询而不需要回表。这就是覆盖索引,

    例如:10W条数据,我要从其中查出100条不连续的数据,给你id,来查name和password进行展示,如何才能高性能的去使用?

    可以建立id、name、password的联合索引,直接根据索引可以查询出数据,可以减少树的搜索次数,不再需要回表查整行记录,显著提升查询性能。

    1.2.2 最左匹配原则

    最左前缀匹配原则:mysql会从左向右进行匹配。

    例如我们定义了(name,password)两个联合索引字段,我们 使用 where name = '张三' and password = '2'索引可以生效的,当我们是颠倒了他们的顺序 使用where password = '1' and name = '王五',索引同样也是可以生效的,在mysql查询优化器会判断纠正这条sql语句该以什么样的顺序执行效率最高,最后才生成真正的执行计划,我们能尽量的利用到索引时的查询顺序效率最高。

    1.2.3 避免放弃使用索引而进行全表扫描

    • 1:应尽量避免在 where 子句中对字段进行 null 值判断;

    • 2:应尽量避免在 where 子句中使用 != 或 <> 操作符;

    • 3:尽量避免在 where 子句中使用 or 来连接条件,如果一个字段有索引,一个字段没有索引,将导致引擎放弃使用索引而进行全表扫描;

    • 4:in 和 not in 也要慎用,否则会导致全表扫描;

    • 5:避免在 where 子句中对字段进行表达式操作或者函数操作;

      表达式操作:

      select id from t where num/2 = 100

      函数式操作:

      select id from t where substring(name,1,3) = ’abc’       -–name以abc开头的id
      select id from t where datediff(day,createdate,’2005-11-30′) = 0   -–‘2005-11-30’   --生成的id

     

     

  • 相关阅读:
    ASP.NET前台代码绑定后台变量方法总结
    <%# Eval("name")%>与<%# Bind("name")%>
    验证数字的正则表达式集
    品高:C#与JAVASCRIPT函数的相互调用:1.如何在JavaScript访问C#函数? 2.如何在JavaScript访问C#变量? 3.如何在C#中访问JavaScript的已有变量? 4.如何在C#中访问JavaScript函数?
    Visual Web Developer 的自定义WebForm模板
    关键字加亮JS方法
    vss安装,设置以及与vs2005联合项目操作(转)
    删除SQL中重复行
    完全兼容的 鼠标滚轴缩放图片
    为循环的repeater的第一行加个样式
  • 原文地址:https://www.cnblogs.com/mayang2465/p/14673565.html
Copyright © 2020-2023  润新知