1. 什么时候使用索引,什么时候不使用索引

    使用:

    • 主键自动建立唯一索引
    • 频繁作为查询条件的字段
    • 查询中与其他表关联的字段,外键关系建立索引
    • 单键/组合索引的选择问题,高并发下倾向创建组合索引
    • 查询中排序的字段,排序字段通过索引访问大幅提高排序速度
    • 查询中统计或分组字段

    不使用:

    • 表记录太少
    • 经常增删改的表
    • 数据重复且分布均匀的表字段,只应该为最经常查询和最经常排序的数据列建立索引(如果某个数据类包含太多的重复数据,建立索引没有太大意义)
    • 频繁更新的字段不适合创建索引(会加重IO负担)
    • where条件里用不到的字段不创建索引
    1. 最左前缀匹配原则

    比如建立了一个联合索引(a,b,c),那么其实我们可利用的索引就有(a), (a,b), (a,b,c)

    1. 索引下推
    • 索引下推(index condition pushdown )简称ICP,在Mysql5.6的版本上推出,用于优化查询。
    • 在不使用ICP的情况下,在使用非主键索引(又叫普通索引或者二级索引)进行查询时,存储引擎通过索引检索到数据,然后返回给MySQL服务器,服务器然后判断数据是否符合条件 。
    • 在使用ICP的情况下,如果存在某些被索引的列的判断条件时,MySQL服务器将这一部分判断条件传递给存储引擎,然后由存储引擎通过判断索引是否符合MySQL服务器传递的条件只有当索引符合条件时才会将数据检索出来返回给MySQL服务器

      回表:因为innodb是将所有数据存在叶子节点上,使用辅助索引时还是要先用主键索引查一遍,在用辅助索引查数据。

    1. 覆盖索引 ,联合索引
    • 覆盖索引:当sql语句的所求查询字段(select列)查询条件字段(where子句)全都包含在一个索引中 (联合索引),可以直接使用索引查询而不需要回表。这就是覆盖索引,通过使用覆盖索引,可以减少搜索树的次数,这就是 覆盖索引
    • 联合索引,也就是多列索引(a,b,c) (a,b) (a)

      sql优化: 减少回表次数,或者直接使用覆盖索引