数据库的索引原理

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) 根--节点--分支--叶

mysql 全文索引性能 mysql全文索引实现原理_聚集索引

B+树

#b+树 在b树的基础上进行了改良 -

-1. 分支节点和根节点都不再存储实际的数据了,让分支和根节点能存储更多的索引的信息,就降低了树的高度,

所有的实际数据都存储在叶子节点中

-2. 在叶子节点之间加入了双向的链式结构(双向链表)方便在查询中的范围条件

-3. mysql中,所有的b+树索引的高度基本控制在3层

mysql 全文索引性能 mysql全文索引实现原理_mysql 全文索引性能_02

第一层存 1-10000的地址,10001-20000的地址,20001-30001的地址。。

第二层存 1-1000,1001-2000...90001-100001地址。。

第三层存 1,msg,jjj; 2,msg,kkkk;...并且第三层是一个双向链表,大大缩减了查询次数

b+树的高度会影响索引的效率,树的高度影响因素

1.选择尽量短的列做索引;每一个节点的存储的信息越多,树的高度也就越低,效率也就越快;

2.对区分度高的列做索引,重复率超过10%不适合;

聚集索引

在innodb中,聚集索引和辅助索引并存,在myisam中,只有辅助索引; 聚集索引:数据直接存储在树结构的叶子

主键创建的索引是聚集索引 其他键创建的索引都是辅助索引

mysql 全文索引性能 mysql全文索引实现原理_mysql 全文索引性能_03

辅助索引

数据不存在树中

叶子节点中存的主键,再通过一次或者多次查到数据;


mysql 全文索引性能 mysql全文索引实现原理_辅助索引_04

辅助索引和聚集索引的配合使用(回表)

mysql 全文索引性能 mysql全文索引实现原理_辅助索引_05

回表:通过辅助索引查到主键之后,去查聚集索引,就叫回表;