5.1 InnoDB存储引擎索引概述
InnoDB存储引擎中的哈希算法是自适应的,B+树的B表示的是平衡,注意,它不是二叉树。
B+树索引不能找到给定键值的具体行,只能找到被查找数据行所在的页,然后数据库通过把页读入内存,再在内存中找到具体行。
5.2 数据结构与算法
二分查找法
略。
二叉查找树和平衡二叉树(ALV)
二叉查找树构建规则,一个节点的左子树都比它小,右子树都比它大。
ALV:满足二叉查找树的定义,且任何节点的子树高度差不能大于1. 查找速度快但是维护代价高。
5.3 B+树
(1)每个结点至多有m个子女;
(2)除根结点外,每个结点至少有[m/2]个子女,根结点至少有两个子女;
(3)有k个子女的结点必有k个关键字。
插入:
B+树结构主要位于磁盘,页的拆分意味着磁盘操作。在左右兄弟还没满的时候,会优先进行旋转操作。
删除:
5.4 B+树索引
特点:高扇出性,在数据库中的高度为2-4层。也就意味着只需要2-4次的IO操作即可。而现在的磁盘每秒差不多在100次IO左右,2-4次意味着查询时间只需0.02-0.04秒。
聚集索引
按照每张表的主键构建一颗B+树,同时叶子节点存储的是表中一整行的信息,也将聚集索引的叶子节点称为数据页。每个数据页都通过双向链表进行链接。
聚集索引的存储不是物理上连续的,而是逻辑上连续的,对于主键的排序查找和范围查找速度非常快。叶子节点的数据就是用户所要查询的数据。
辅助索引
叶子节点并不包含行记录的全部数据。叶子节点除了包含键值以外,每个叶子节点中的索引行还包含了一个书签,用来告诉InnoDB存储引擎在哪里可以找对与索引行相对应的行数据。
索引创建与管理
创建: alter table test
and key idx_b (b(100));
5.5 Cardinality值
一个数值,用来衡量是否需要添加B+树索引。
建立索引的前提:列中的数据具有高选择性。
Cardinality更新策略: 略。
5.6 B+树索引的使用
不同应用中的使用
OLTP/OLAP
联合索引
指对表上的多个列进行索引。 key idx_a_b ( a,b)
联合索引已经对第二个键值进行了排序处理。
覆盖索引
从辅助索引中查询,而不需要使用聚集索引。 一般是进行select count时。
优化器选择不使用索引的情况
多发送于范围查找,join链接操作等情况。当数据量大于0.2时,优化器会选择联合索引而非覆盖索引。
索引提示
发送在1.优化器选择非常多 2.某sql可以选择的索引非常多
Multi-Range Read 优化
目的:减少磁盘的随机访问,并且将随机访问转化为较为顺序的数据访问。
优点:使数据访问变得较为顺序。减少缓冲池中页被替换的次数。批量处理对键值的查询操作。
ICP 优化
5.7 哈希算法
哈希表
碰撞:两个关键字映射到同一个槽上。
碰撞解决技术:链接法。把散列到同一槽中的所有元素都放在一个链表中。
h(k)=k%m
InnoDB存储引擎中的哈希算法
冲突机制采用链表方式,哈希函数采用除法散列方式。m取值为略大于2倍的缓冲池页数量的质数。
自适应哈希索引
5.8 全文检索
概述
将存储于数据库中的整本书或者整篇文章中的任意内容查找出来的技术,也可以进行各种统计和分析。
特别的,InnoDB存储引擎开始支持全文检索。
倒排索引
实现全文检索的索引结构。将word存放在一张表中。