数据库相关知识整理(二)

索引

索引的本质上是一个存储列值的数据结构。如果在某列上使用了 B-树索引,那么这些列值在索引中是被排过序的,有序的值是索引能提高查询性能的主要原因。

索引的优点和缺点

优点:

通过创建唯一性索引,可以保证数据库表中每一行数据的唯一性。

可以大大加快数据的检索速度,这也是创建索引的最主要的原因。

可以加速表和表之间的连接,特别是在实现数据的参考完整性方面特别有意义。

在使用分组和排序子句进行数据检索时,同样可以显著减少查询中分组和排序的时间。

通过使用索引,可以在查询的过程中,使用优化隐藏器,提高系统的性能。

缺点:

创建索引和维护索引要耗费时间,这种时间随着数据量的增加而增加。

索引需要占物理空间,除了数据表占数据空间之外,每一个索引还要占一定的物理空间,如果要建立聚簇索引,那么需要的空间就会更大。

当对表中的数据进行增加、删除和修改的时候,索引也要动态的维护,这样就降低了数据的维护速度。

添加索引原则

在查询中很少使用或者参考的列不应该创建索引。

只有很少数据值的列也不应该增加索引。

定义为text、image和bit数据类型的列不应该增加索引。

当修改性能远远大于检索性能时,不应该创建索引。

几种索引类型

普通索引:仅加速查询
唯一索引:加速查询 + 列值唯一(可以有 null)
主键索引:加速查询 + 列值唯一(不可以有 null)+ 表中只有一个
组合索引:多列值组成一个索引,专门用于组合搜索,其效率大于索引合并
全文索引:对文本的内容进行分词,进行搜索

mysql索引原理

哈希索引

只有 memory (内存)存储引擎支持哈希索引,哈希索引用索引列的值计算该值的hashCode,然后在 hashCode 相应的位置存执该值所在行数据的物理位置,因为使用散列算法,因此访问速度非常快,但是一个值只能对应一个 hashCode, 而且是散列的分布方式,因此哈希索引不支持范围查找和排序的功能。

B+树索引

因为磁盘IO每次读取一个页,B+树每个节点大小为一个页,非叶节点不存储数据,能存更多key,树高更小,查询更快。

BTree 索引
BTree 是平衡搜索多叉树,设树的度为 d(d>1),高度为 h,那么 BTree 要满足以下条件:
每个叶子结点的高度一样,等于 h;
每个非叶子结点由 n-1 个 key 和 n 个指针 point 组成,其中 d<=n<=2d,key 和 point 相互间隔,结点两端一定是 key;
叶子结点指针都为 null;
非叶子结点的 key 都是[key,data]二元组,其中 key 表示作为索引的键,data 为键值所在行的数据

在 BTree 的机构下,就可以使用二分查找的查找方式,查找复杂度为 h*log(n),一般来说树的高度是很小的,一般为 3 左右,因此 BTree 是一个非常高效的查找结构。

B+Tree 索引
B+Tree 是 BTree 的一个变种,设 d 为树的度数,h 为树的高度,B+Tree 和 BTree 的不同主要在于:
B+Tree 中的非叶子结点不存储数据,只存储键值;
B+Tree 的叶子结点没有指针,所有键值都会出现在叶子结点上,且 key 存储的键值对应的数据的物理地址;

一般来说 B+Tree 比 BTree 更适合实现外存的索引结构,因为存储引擎的设计专家巧妙的利用了外存(磁盘)的存储结构,即磁盘的一个扇区是整数倍的 page(页),页是存储中的一个单位,通常默认为 4K,因此索引结构的节点被设计为一个页的大小,然后利用外存的“预读取”原则,每次读取的时候,把整个节点的数据读取到内存中,然后在内存中查找,已知内存的读取速度是外存读取 I/O 速度的几百倍,那么提升查找速度的关键就在于尽可能少的磁盘 I/O,那么可以知道,每个节点中的 key 个数越多,那么树的高度越小,需要 I/O的次数越少,因此一般来说 B+Tree 比 BTree 更快, 因为 B+Tree 的非叶节点中不存储 data
域 ,就可以存储更多的 key 。
带顺序索引的 B+TREE
很多存储引擎在 B+Tree 的基础上进行了优化,添加了指向相邻叶节点的指针,形成了带有顺序访问指针的 B+Tree ,这样做是为了提高区间查找的效率,只要找到第一个值那么就可以顺序的查找后面的值。

在Innodb下主键索引是聚集索引,在Myisam下主键索引是非聚集索引

 

聚簇索引和非聚簇索引的区别

聚簇索引的叶子节点存放的是主键值和数据行,支持覆盖索引;二级索引的叶子节点存放的是主键值或指向数据行的指针。

由于节子节点(数据页)只能按照一颗B+树排序,故一张表只能有一个聚簇索引。辅助索引的存在不影响聚簇索引中数据的组织,所以一张表可以有多个辅助索引

注: 覆盖索引(covering index)指一个查询语句的执行只用从索引中就能够取得,不必从数据表中读取。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章