MySQL索引的类型

在《高性能MySQL》中按照数据结构的不同将索引分为B+树索引、哈希索引、全文索引。B+树索引就是传统意义上的索引

使用索引的优点:

第一,索引大大减少了服务器需要扫描的数据量,可以帮助服务器避免排序和临时表,索引可以将随机I/O变为顺序I/O

第二,可以大大加快数据的检索速度,这也是创建索引的最主要的原因。
第三,可以加速表和表之间的连接,特别是在实现数据的参考完整性方面特别有意义。
第四,在使用分组和排序子句进行数据检索时,同样可以显著减少查询中分组和排序的时间。
第五,通过使用索引,可以在查询的过程中,使用优化隐藏器,提高系统的性能。

使用索引的缺点:

第一,创建索引和维护索引要耗费时间,这种时间随着数据量的增加而增加。
第二,索引需要占物理空间,除了数据表占数据空间之外,每一个索引还要占一 定的物理空间,如果要建立聚簇索引,那么需要的空间就会更大。
第三,当对表中的数据进行增加、删除和修改的时候,索引也要动态的维护,这 样就降低了数据的维护速度。

哈希索引

哈希索引是基于哈希表实现的,哈希表也称散列表。存储引擎会为所有的索引列计算一个哈希码。哈希索引将所有的哈希码存储在索引中,同时在哈希表中保存指向每个数据行的指针。

哈希索引的一些限制

(1)哈希索引只包含哈希值和行指针,而不存储字段值。所以不能覆盖索引,必须要读取表中的数据行

(2)哈希索引数据不是按照索引值顺序存储的,所以无法用于排序

(3)哈希索引不支持部分索引列匹配查询,因为哈希值是根据索引列的全部内容来计算的。例如建立哈希索引(a,b),如果查询数据只有a,则无法使用该索引。

(4)哈希索引只支持等值查询,不支持范围查询。例如,不支持select...where age>22

(5)访问哈希索引的数据非常快,除非有很多哈希冲突(不同的索引列值,却有相同的哈希码),如果哈希冲突很多,索引维护的代价会很高。当出现哈希冲突时,存储引擎必须遍历链表中所有的行指针,逐行比较直到找到符合条件的行。

详情见《高性能MySQL》5.1.1索引的类型和 《MySQL技术内幕》5.7哈希算法

Innodb存储引擎使用哈希算法来对字典进行查找,解决哈希冲突的采用链表方式,哈希函数采用除法散列方式。

自适应哈希索引

innodb存储引擎有一个特殊的功能叫自适应哈希索引(adaptive hash index),当innodb注意到某些索引值被使用的非常频繁时,它会在内存中基于B+树索引上再创建一个哈希索引。这就让B+树索引也具有一些哈希索引的优点,比如快速的哈希查找。这是一个完全自动,内部的行为,用户无法控制或配置。

全文索引

全文检索(full-text search)使用倒排索引(inverted index)来实现,倒排索引在辅助表(auxiliary table)中存储了单词和单词在一个或多个文档中所在位置的映射。Innodb从1.2.x版本开始支持全文检索技术,采用full inverted index的方式,在innodb 中将(DocumentId,Position)视为一个ilist。因此在全文检索的表中有两个字段,一个是Word字段一个是ilist字段。并且在Word字段上设有索引。

在Innodb的全文索引中,还有一个重要的概念就是FTS Index Cache(全文检索索引缓存),用来提高全文检索的性能。FTS Index Cache是一个红黑树结构,其根据(word,ilist)进行排序。

红黑树

 R-B Tree,全称是Red-Black Tree,又称为“红黑树”,它一种特殊的二叉查找树。红黑树的每个节点上都有存储位表示节点的颜色,可以是红(Red)或黑(Black)。

红黑树的特性:
(1)每个节点或者是黑色,或者是红色。
(2)根节点是黑色。
(4)如果一个节点是红色的,则它的子节点必须是黑色的。
(5)从一个节点到该节点的子孙节点的所有路径上包含相同数目的黑节点。

红黑树的应用

红黑树的应用比较广泛,主要是用它来存储有序的数据,它的时间复杂度是O(lgn),效率非常之高。例如,Java集合中的TreeSetTreeMap,以及Linux虚拟内存的管理,都是通过红黑树去实现的

B+树索引

参考博客:http://www.admin10000.com/document/5372.html

B+树索引的构造类似于二叉树,根据键值快速找到数据,B+树中的B代表平衡(balance),B+树索引并不能找到一个给定键值的具体行,B+树索引只能找到被查找数据行所在的页,数据库把页读入到内存中,最后在内存中查找到相应的数据。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值