首页 > 技术文章 > 《SQL优化入门》讲座总结

phonecom 2019-04-19 10:07 原文

  • 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如何使用索引提高查询效率
      • 使用索引的场景
      1、匹配全值
          对索引中所有列都指定具体值,即对索引中的所有列都有等值匹配的条件
      2.匹配值的范围查询
          对索引的值能够进行范围查找
      3.匹配最左前缀
          仅仅使用索引中的最左边列进行查询
      4.仅对索引进行查询
      
      • 不使用索引的场景
      1.以%开头的like查询
      2.数据类型出现隐式转化,不会使用索引
      3.组合索引,不满足最左原则,不使用聚合索引
      4.用or分割条件,若or前后只要有一个列没有索引,就都不会用索引
          使用 union all代替提高效率
      5.使用!= 或 <> 操作符时
      6.索引部分等值匹配,部分范围匹配
      
  • SQL使用的规范
    1.禁止使用SELECT *,只获取必要的字段,需要显示说明列属性

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

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

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

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

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

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

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

推荐阅读