索引时数据库提高数据查询处理性能的一个非常关键的技术,索引的使用可以对性能产生上百倍甚至上千倍的影响。接下来,会介绍索引的基本原理、概念,并深入学习数据库中所使用的索引结构和存储方式,以及如何管理、维护索引等。

1.索引的基本概念

索引时用来快速查询表记录的一种存储结构,一般使用索引有一下两个方面:

  1. 确定记录的唯一性[唯一性索引,来保证表中记录的唯一性要求]
  2. 提高数据查询的性能
提高表记录查询性能是索引存在的最大有点,在没有索引的情况下,数据库优化器需要采用顺序扫描的方式
扫描全表来查找目标记录。
具体做法是:
	读取所有术语该表的数据页,从表的第一个数据页开始,顺序访问所有包含该表数据页的设备,知道最
后一页为止,返回满足条件的所有行。在扫描小表的记录和需要查询大表中大多数记录的情况下,顺序烧苗
是一种不错的选择。小表只占用很少的数据页,对于小表的顺序烧苗需要的IO非常小。对于大表上进行全表
扫描的情况,如数据仓库中对系统报表进行查询统计时,需要利用全表数据进行max、min、avg、sum等包
含聚合函数的查询,此时整个表的数据都是查询结果所需要的,这使得顺序扫描优于随机扫描。

性能比较差的时候,如下所述:

	顺序扫描在OLTP系统中性能太低,OLTP系统的特点是一个事务需要处理的记录数非常少,但是表中的
记录量非常大。若在大表中寻找满足一定条件的少量记录(比如 <= 5%),么顺序扫描需要大量的IO动作,
同时消耗大量的内存,把不需要的数据页填充到内存缓存区中,影响buffer的使用进而影响整个数据库的
性能。因此我们不应该使用顺序扫描档方式去访问随机的或者非顺序存储的数据,这会导致非常明显的性
能损失。在这样的条件下,数据库通过查询索引中记录的行数据所在的物理位置的信息,就可以快速读取
满足条件的少量记录行,而不影响将整个表记录都读取到内存中,因此索引可以有效地减少IO。
总结:索引适用于离散数据扫描的场景

有无索引在表关联中的对比

当量表进行关联连接且其中一张表很大时,索引也是必要存在的。
分析:
	在没有索引的情况下,两张表进行关联时,且套循环的迭代连接过程将严重影响表关联的性能。此时
需要将第一章表中每条满足条件的记录注意与第二张表进行全表记录匹配,如果第二张表非常大,则全表
扫描的方式将大大影响表关联的效率。在有索引的情况下,优化器可以通过索引找到目标记录,大大减少
匹配次数。当然实际的数据库优化器会对没有索引的表实施创建Hash索引,采用HashJoin方式进行关联。

索引概述:

索引是数据库中的一种结构或者对象,数据库索引与数或者文件柜的索引非常像。它以记录的特征(通常
是一个或多个字段的值)作为输入,能够快速找到该特征的记录,为查询提供快速访问符合条件的数据
行的能力。利用索引进行随机访问时,能够最小化IO,显著提高性能。数据库中的索引是一种动态的数
据结构,它会和表中的数据一起改变。在一个表中可以有多个索引,用来满足不同查询的需要。

什么情况数据库优化器可以使用索引对查询进行加速 ?

	1.使用随机访问方式代替全表数据的顺序访问时;
	2.查询表达式只有索引列时,可以避免读取表中的其他数据行;
	3.在执行GROUP BY和ORDER BY子句时,避免不必要的排序操作(包括创建临时表).通常数据库优
	化器决定是否使用索引,当然我们也可以强迫数据库优化器使用或者避免使用索引。
在执行查询前,如果恰当地在列上建立了索引,则可以节省上千次、上万次,在极限情况下甚至节省
了百万次。但是索引也需要占用空间和资源,来进行额外的处理和索引维护等工作。

2.索引的结构

2.1 B+树

数据库常用的索引会有有二叉搜索树、B树、B+树、Hahs、位图和R树,其中使用最广泛的是B+树。
B+树可以看做成改进的B树,在了解B+树之前,我们来看看B树的索引结构。B树把各个存储快组织成一棵
树,这个树总是保持平衡的,即所有叶子节点总局又相同的深度。B树有是那种节点:根节点、分支节点、
叶子节点。根节点指向多个分支节点,分支节点指向叶子节点,也直接点指向实际的数据行记录【数据
页的地址】

深入学习B树

B树说明:
	B树的阶:节点的最多子节点个数。比如2-3树的阶是3,2-3-4树的阶是4.
	B-树的搜索:从根节点开始,对结点内的关键字(有序)序列进行二分查找,如果命中则结束,否则
	进入查询关键字所属范围的儿子节点;重复;直到所对应的儿子指针为空,或已经是叶子节点。
一棵m阶B树是一棵平衡的m路搜索树,每个存储快(节点)存储m个关键字和m+1个指针。它或者是空树,
或者是满足一下性质的树。
	根节点至少至少包含两个孩子节点,即至少有两个指针被引用,每个指针指向B树的下一层存储快。
	总是保持数据的有序性,每个存储块中的关键字按递增顺序排列