MySQL的索引原理(图解)
数据库的索引原理
0.什么是索引
索引是一种特殊的文件(InnoDB数据表上的索引是表空间的一个组成部分),它们包含着对数据表里所有记录的引用指针。更通俗的说,数据库索引好比是一本书前面的目录,能加快数据库的查询速度,但是会降低写入速度。
- show index from table_name; 查看索引
- create index 索引名字 on 表(字段); 创建辅助索引
- drop index 索引名字 on 表(字段); 删除索引
1.索引类型
1.0.全文索引(FULLTEXT)
MySQL从3.23.23版开始支持全文索引和全文检索,FULLTEXT索引仅可用于 MyISAM 表;
1.1普通索引
辅助索引
1.2. 唯一索引
与普通索引类似,不同的就是:索引列的值必须唯一,但允许有空值(注意和主键不同)。如果是组合索引,则列值的组合必须唯一,创建方法和普通索引类似。
1.3. 主键索引
聚集索引
1.4. 单列索引、多列索引
多个单列索引与单个多列索引的查询效果不同,因为执行查询时,MySQL只能使用一个索引,会从多个索引中选择一个限制最为严格的索引。
1.5. 组合索引(最左前缀)
联合索引
2.数据库索引原理
- B树结构(blance tree) 根--节点--分支--叶
-
B+树
#b+树 在b树的基础上进行了改良 - -1. 分支节点和根节点都不再存储实际的数据了,让分支和根节点能存储更多的索引的信息,就降低了树的高度, 所有的实际数据都存储在叶子节点中 -2. 在叶子节点之间加入了双向的链式结构(双向链表)方便在查询中的范围条件 -3. mysql中,所有的b+树索引的高度基本控制在3层
第一层存 1-10000的地址,10001-20000的地址,20001-30001的地址。。
第二层存 1-1000,1001-2000...90001-100001地址。。
第三层存 1,msg,jjj; 2,msg,kkkk;...并且第三层是一个双向链表,大大缩减了查询次数
-
b+树的高度会影响索引的效率,树的高度影响因素
- 1.选择尽量短的列做索引;每一个节点的存储的信息越多,树的高度也就越低,效率也就越快;
- 2.对区分度高的列做索引,重复率超过10%不适合;
-
聚集索引
- 在innodb中,聚集索引和辅助索引并存,在myisam中,只有辅助索引; 聚集索引:数据直接存储在树结构的叶子
- 主键创建的索引是聚集索引 其他键创建的索引都是辅助索引
-
辅助索引
- 数据不存在树中
- 叶子节点中存的主键,再通过一次或者多次查到数据;
-
辅助索引和聚集索引的配合使用(回表)
- 回表:通过辅助索引查到主键之后,去查聚集索引,就叫回表;