ChatGPT3.5使用体验( 二 )


3、组合索引不能利用部分索引,也就是不支持最左匹配原则,对于组合索引,Hash 索引在计算 Hash 值的时候是组合索引键合并后再一起计算 Hash 值,而不是单独计算 Hash值,所以通过组合索引的前面一个或几个索引键进行查询的时候,Hash 索引也无法被利用;
4、哈希索引需要进行回表查询,因为哈希索引存储的都是哈希值和行指针,所以不能避免使用索引来避免读取行 。
中还有一个特殊的功能叫做"自适应哈希索引( hash index)" 。当注意到某些索引值被使用的非常频繁时,它会在内存中基于 B+tree 索引之上在创建一个哈希索引,这样就能让 B+tree 索引也有哈希索引快速查找的优点了,这是一个完全自动,内部的过程,用户无法控制或者配置,不过这个功能可以手动关闭 。
中的自适应 Hash 相当于是“索引的索引”,采用 Hash 索引存储的是 B+ 树索引中的页面的地址 。这也就是为什么可以称自适应 Hash 为索引的索引 。采用自适应 Hash 索引目的是可以根据 SQL 的查询条件加速定位到叶子节点,特别是当 B+ 树比较深的时候,通过自适应 Hash 索引可以提高数据的检索效率 。同时对于非聚簇索引中的查询,自适应哈希也能减少回表的次数 。
全文索引
全文索引就是将存储于数据库中的整本书或整篇文章中的任意内容信息找出来的技术,可以根据需求获取全文中的有关文章,节,段,句,词等信息,也能进行统计和分析 。
最早是不支持存储全文索引的,想要使用全文索引就要选用存储引擎,从版本1.2.x开始才增加了全文索引支持 。
全文索引一般使用倒排索引( index)实现,倒排索引和 B+ 树索引一样,也是一种索引结构 。
倒排索引在辅助表 ( table) 中存储了单词与单词自身在一个或多个文档中所在位置之间的映射 。这样当全文索引,匹配到对应的单词就能知道对应的文档位置了 。
倒排索引是区别于正排索引的概念:
正排索引:是以文档对象的唯一 ID 作为索引,以文档内容作为记录的结构 。
倒排索引: index,指的是将文档内容中的单词作为索引,将包含该词的文档 ID 作为记录的结构 。
倒排索引中文档和单词的关联关系,通常使用关联数据实现,主要有两种实现方式:
1、 file index: 会记录单词和单词所在的文档 ID 之间的映射;
2、fullindex: 这种方式记录的更详细,除了会记录单词和单词所在的文档 ID 之间的映射,还会记录单词所在文档中的具体位置 。
下面来举个栗子
表示全文索引中文件的 id, Text 表示存储的内容 。这些存储的文档就是全文索引需要查询的对象 。
file index
可以看到关联中,记录了单词和的映射,这样通过对应的单词就能找到,单词所在的文档,不用一个个遍历文档了 。
fullindex
这种方式和上面的 file index一样也会记录单词和文档的映射,只不过记录的更详细了,还记录了单词在文档中的具体位置 。
相比于 file index优点就是定位更精确,缺点也是很明显,需要用更多的空间 。
存储引擎支持全文索引采用fullindex的方式,将(,)视为一个ilist 。
因此在全文检索的表中,一共有两列,一列是 word 字段,另一个是ilist,并且在 word 字段上设有索引 。
记录单词和的映射关系的表称为 Table(辅助表) 。
辅助表是存在与磁盘上的持久化的表,由于磁盘I/O比较慢,因此提供FTS Index Cache(全文检索索引缓存)来提高性能 。FTS Index Cache是一个红黑树结构,根据(word, list)排序,在有数据插入时,索引先更新到缓存中,而后存储引擎会批量进行更新到辅助表中 。