《SQL优化入门》讲座总结

  • MySQL运行机制缓存

    • MySQL每一个query只能运行在一个CPU上,更多的CPU,更快的CPU会更有利于并发
  • MySQL执行计划并发

    • Using filesort: 表示没法利用索引完成排序,也有多是由于多表链接时,排序字段不是驱动表中的字段MySQL中没法利用索引完成的排序操做称为"文件排序"。
    • Using temporary:表示须要建立临时表以知足需求,一般是由于GROUP BY的列没有索引,或者GROUP BY和ORDER BY的列不同,也须要建立临时表,建议添加适当的索引。
    • Using index: 表示相应的select 操做中使用了覆盖索引(Covering index),避免访问了表的数据行,效果不错!若是同时出现Using where,代表索引被用来执行索引键值的查找。若是没有同时出现Using where,表示索引用来读取数据而非执行查找动做。
    • Covering Index:覆盖索引也叫索引覆盖,就是select 的数据列只用从索引中就可以取得,没必要读取数据行,MySQL能够利用索引返回select 列表中的字段,而没必要根据索引再次读取数据文件。
    • Using index condition: 在5.6版本后加入的新特性,优化器会在索引存在的状况下,经过符合RANGE范围的条数 和 总数的比例来选择是使用索引仍是进行全表遍历。
    • Using where: 代表使用了where 过滤
    • Using join buffer: 代表使用了链接缓存
    • impossible where: where 语句的值老是false,不可用,不能用来获取任何元素
    • distinct: 优化distinct操做,在找到第一匹配的元组后即中止找一样值的动做。
    • 注意
      • 看下 type 这列的结果,若是有类型是 ALL 时,表示预计会进行全表扫描(full table scan)。一般全表扫描的代价是比较大的,建议建立适当的索引,经过索引检索避免全表扫描
      • 再来看下 Extra 列的结果,若是有出现 Using temporary 或者 Usingfilesort 则要多加关注
  • MySQL如何使用索引函数

    • 索引匹配流程
    • 建索引的原则
    1.最左前缀匹配原则,很是重要的原则
    2.选择区分度高的列做为索引,即一个字段值的分布要多,像状态值这种只有几个值的就不要建了
    3.索引列不能参与计算
    4.尽可能的扩展索引,不要新建索引
    • MySQL如何使用索引提升查询效率
      • 使用索引的场景
      一、匹配全值
          对索引中全部列都指定具体值,即对索引中的全部列都有等值匹配的条件
      2.匹配值的范围查询
          对索引的值可以进行范围查找
      3.匹配最左前缀
          仅仅使用索引中的最左边列进行查询
      4.仅对索引进行查询
      • 不使用索引的场景
      1.以%开头的like查询
      2.数据类型出现隐式转化,不会使用索引
      3.组合索引,不知足最左原则,不使用聚合索引
      4.用or分割条件,若or先后只要有一个列没有索引,就都不会用索引
          使用 union all代替提升效率
      5.使用!= 或 <> 操做符时
      6.索引部分等值匹配,部分范围匹配
  • SQL使用的规范
    1.禁止使用SELECT *,只获取必要的字段,须要显示说明列属性优化

    2.禁止使用INSERT INTO t_xxx VALUES(xxx),必须显示指定插入的列属性code

    3.禁止使用属性隐式转换排序

    4.禁止在WHERE条件的属性上使用函数或者表达式索引

    5.禁止负向查询,以及%开头的模糊查询
    负向查询条件:NOT、!=、<>、!<、!>、NOT IN、NOT LIKE等,会致使全表扫描it

    6.禁止大表使用JOIN查询,禁止大表使用子查询io

    7.禁止使用OR条件,必须改成IN查询,或者 union、union alltable

    8.应用程序必须捕获SQL异常,并有相应处理

相关文章
相关标签/搜索