MYSQL 索引

MYSQL 索引

    • 什么是索引
    • 索引的优缺点
    • 索引原理
      • 索引存储结构
        • B树和B+树
        • 非聚集索引(MyISAM)
        • 聚集索引(InnoDB)
    • 创建索引的情况
    • 不需要创建索引
    • 为什么使用组合索引
    • 查看执行计划
      • type
    • 索引失效情况
    • 最左匹配原则

什么是索引

为了提高查询的一种分散存储的数据结构

索引的优缺点

优点:
1.提高数据检索效率,降低IO成本
2.可以通过索引对数据进行排序,降低内存消耗
缺点:
1.占用磁盘内存
2.会影响表更新数据效率

索引原理

索引存储结构

  • 存储引擎决定
  • MyISAM和InnoDB存储引擎:只支持B+TREE索引,不能更换

B树和B+树

  • 树的高度会影响IO读写次数
  • 三层树结构支持数据可以达到20G,4层可以达到几十T

区别非叶子节点是否存储数据,B树会存,B+TREE不会存,B+TREE只有叶子节点才会存储数据,并且是有序的

非聚集索引(MyISAM)

数据和索引不存放在一起的,数据里会存放索引的地址(指针)

聚集索引(InnoDB)

  • 主键索引会存储数据行,索引和数据放在一起
  • 辅助索引只存储主键值 ,与MyISAM区别是MyISAM存的是索引地址
  • 如果没有主键索引,会使用唯一索引建立聚集索引

注意:非主键查询需要回表查询先查询辅助索引树获取主键,再在主键索引树上查询到数据

创建索引的情况

1.频繁查询的字段
2.关联查询时的关联字段
3.需要排序的字段
4.需要分组的字段

不需要创建索引

1.记录太少
2.频繁更新
3.where 条件使用频率不高的字段

为什么使用组合索引

节省索引存储空间

查看执行计划

EXPLAIN命令能够对sql查询语句进行分析,输出执行的详细信息,可以提供开发人员进行优化。
主要作用是观察是否使用到索引是否是全表扫描等。

type

从好到差顺序如下:

system,const,eq_ref,ref,fulltext,ref_or_null,unique_subquery,index_subquery,range,
index_merge,index,ALL

除了all之外,其他的type都可以使用到索引,除了index_merge之外,其他的type只可以用到一个索引
平时使用时最好使用到range级别
常见type解释:

const:使用唯一索引或者主键,返回记录一定是1行记录的等值where条件时
eq_ref:连接字段主键或者唯一性索引。此类型通常出现在多表的 join 查询, 表示对于前表的每一个结果, 都只能匹配到后表的一行结果.
ref:针对非唯一性索引,使用等值(=)查询非主键。或者是使用了最左前缀规则索引的查询。
range:索引范围扫描,常见于使用>,<,is null,between ,in ,like等运算符的查询中。

索引失效情况

  • 在索引列上做操作(计算、函数等),索引失效变成全表扫描
  • 使用不等于(!= 或者<>)
  • is null ,is not null l
  • like 以通配符开头"%"
  • 字符串不加单引号
  • or连接会导致索引失效

最左匹配原则

索引树上建立的索引是有序的,按照从左至右的顺序建立,查询时从最左边的索引开始,中间的索引不能中断,中断了只有前面的索引有使用到。

你可能感兴趣的:(数据库,mysql)