索引
- 1. 索引概述
- 1.1 索引
- 1.2 索引的优缺点
- 1.2.1 优点
- 1.2.2 缺点
- 2. InnoDB中的索引
- 2.1 主键索引设计方案
- 2.2 索引底层数据结构
- 2.3 常见索引
- 2.3.1 聚簇索引
- 2.3.1.1 优点
- 2.3.1.2 缺点
- 2.3.2 非聚簇索引
- 2.3.3 联合索引
- 3. MyISAM中的索引
- 3.1 MyISAM 与 InnoDB对比
1. 索引概述
1.1 索引
- 索引是帮助MySQL快速获取数据的一种数据结构;
- 创建索引可以有效降低磁盘I/O的次数;
1.2 索引的优缺点
1.2.1 优点
- 降低磁盘I/O的次数,提高数据获取效率;
- 创建唯一索引,可以保证数据库表中每一行数据的唯一性 ;
- 在实现数据的参考完整性方面,可以加速表和表之间的连接 。换句话说,对于有依赖关系的子表和父表联合查询时,可以提高查询速度;
- 在使用分组和排序子句进行数据查询时,可以显著减少查询中分组和排序的时间 ,降低了CPU的消耗;
1.2.2 缺点
- 创建和维护索引需要耗费时间;
- 索引需要占据磁盘空间;
- 索引会导致数据表的更新效率变低;
2. InnoDB中的索引
2.1 主键索引设计方案
- 数据页:存储真实数据,页内数据按照主键大小依次排列;
- 目录项记录数据页:为每个数据页建立目录项,目录项记录组成的数据页为目录项记录数据页;
- 目录项记录数据页的页:表示范围更广的目录项记录页;
注意:每个数据页均会根据主键生成页目录,依次可进行二分查找提高查找效率;
2.2 索引底层数据结构
- InnoDB存储引擎下,索引底层数据结构采用B+树实现;
- B+树是一种多叉平衡搜索树,此树高度较低,可大幅降低磁盘I/O次数,提高搜索效率;
- 在此种结构中,只有叶子节点为真实数据页,数据页大小默认为16KB;非叶子节点均为目录项记录页,用于存储下属主键及对应数据页的页码;
- 叶子节点之间使用双向链表连接,数据页内记录之间使用单向链表连接;
- 叶子结点为第0层,从下往上层数变大;
- 每个数据页有对应的页目录,由此可使用二分查找快速定位;
- 实际工程中,B+树高度一般不会超过4层,因为高度为4层时可存储的数据量已经非常巨大;
- 创建B+树时有三个注意点:
1)根页面位置通过页复制、页分裂操作万年不动;
2)内节点中目录项要保证唯一性;
3)一个页面至少存储两条记录;
2.3 常见索引
- 常见索引可分为聚簇索引和非聚簇索引两种;
- 聚簇索引一般指主键索引,如果数据表没有主键,则会使用非空唯一索引替代。如果没有非空唯一索引,则InnoDB会隐式定义一个主键创建聚簇索引;
- 非聚簇索引,也称为二级索引或辅助索引;
2.3.1 聚簇索引
- 聚簇索引一般指按照主键创建的索引;
- 叶子结点中存储用户的完整数据记录;
- InnoDB自动创建聚簇索引;
- 数据页中数据按照主键进行排序;
- 对于聚簇索引而言,“数据即索引,索引即数据”;
- InnoDB支持聚簇索引,而MyISAM不支持聚簇索引;
- 数据的物理存储排序方式只有一种,因此每个数据表有且仅有一个聚簇索引,一般为主键索引;
- 为充分利用聚簇索引的聚簇特性,数据表一般选用有序的顺序id作为主键;
2.3.1.1 优点
- 数据访问速度更快,相比二级索引而言不用回表;
- 对于主键的排序查找和范围查找速度非常快;
- 聚簇特性使得磁盘I/O次数更低;
2.3.1.2 缺点
- 插入速度严重依赖插入顺序;
- 主键更新代价很高;
- 二级索引查找数据需要两次索引查找,涉及回表操作;
2.3.2 非聚簇索引
- 非聚簇索引为根据非主键创建的索引;
- 非聚簇索引底层结构中非叶子结点与聚簇索引结构类似,区别在于非聚簇索引的叶子结点中只存储索引创建时依据的字段值以及该记录对应主键值;
- 非聚簇索引数据页中的数据依据对应字段排序;
- 根据非聚簇索引查找数据时,先确定该字段值对应的主键值,然后通过聚簇索引确定完整记录,此操作称为回表操作;
2.3.3 联合索引
- 联合索引本质也是二级索引;
- 联合多个非主键列创建二级索引,称为联合索引;
- 数据页中数据同时根据多个列进行排序;
3. MyISAM中的索引
- MyISAM存储引擎中默认采用B+树实现索引;
- MyISAM不支持聚簇索引,可将其索引理解为二级索引;
- MyISAM下索引叶子结点中每个记录存储真实数据记录对应的地址;
- MyISAM索引文件与数据文件分开存储;