MYSQL 索引
什么是索引
为了提高查询的一种分散存储的数据结构
索引的优缺点
优点:
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连接会导致索引失效
最左匹配原则
索引树上建立的索引是有序的,按照从左至右的顺序建立,查询时从最左边的索引开始,中间的索引不能中断,中断了只有前面的索引有使用到。