索引结构—B+Tree索引、Hash索引、Full-Text(全文)索引、R-Tree(空间)索引

news2024/11/28 5:30:10

一、概述

在数据库系统中,索引是一种用于加快数据检索的数据结构。不同的索引结构适用于不同的查询场景和数据特性。索引按照不同角度可以划分不同类型的索引。按照数据结构可以划分B+Tree索引、Hash索引、FULL TEXT(全文)索引、R-Tree(空间)索引

二、索引结构

mysql的索引是作用于存储引擎上的,不同的存储引擎支持不同数据结构的索引。mysql中按照索引结构可以划分B+树索引、Hash索引、FULL TEXT索引(全文索引)、R-Tree索引四种索引结构。

索引结构

描述

InnoDB

MsylSAM

Memory

B+Tree索引

最常用的索引类型,是一种自平衡树的数据结构。大多数引擎都支持,适用于大数据的排序和搜索

支持

支持

支持

Hash索引

基于hash表实现,通过hash函数计算键值的hash值快速精准定位数据,不支持范围和排序查询

不支持

不支持

支持

Full Text(全文)索引

是一种通过建立倒序排序,快速检索文本的方式,适用于文本密集性的查询。很少使用

5.6版本后支持

支持

不支持

R-tree(空间)索引

是B树像多维空间发展的一种方式,是一种特殊的索引类型,主要用于地理空间类型的查询

不支持

支持

不支持

在mysql中支持Hash索引的是Memory引擎;而InnoDB引擎具有自适应Hash索引的功能,根据B+树索引在指定条件下自动构建的。

1、B+Tree索引

1.1 原理

B+Tree

B+树是由二叉树 —> 红黑树(自平衡二叉树)—> B-Tree树(多路平衡查找树)演化而来的。B+树也是多路平衡查找树,相对于B-Tree,所有数据都存储在叶子节点上,根节点只起到索引作用。所有叶子节点形成了一个单向链表。叶子节点将数据按照大小排列,且相邻叶子节点按照大小排列。非叶子节点只起到索引作用。

Mysql的B+Tree索引

mysql的索引结构对经典的B+Tree进行了优化,在原来B+tree基础上,增加了一个指向相邻叶子节点的链表指针,所有叶子节点形成了双向循环链表,提高查询效率。

1.2 特点

a. B+Tree是一种多路自平衡树的数据结构,它能够保持数据排序、搜索、插入和删除操作的时间复杂度都为O(logn)。

b. 所有值都存储在叶子节点上,每个节点可以有多个叶子节点,使得B+Tree的高度较低,从而减少磁盘的IO操作。

1.3 优缺点

优点

a. 高效数据检索:由于B+Tree层级较低,查询速度快。

b. 支持范围查询:由于叶子节点通过指针相互链接,形成双向链表,可以快速进行范围查询。

c.  减少IO操作:每个节点有多个叶子节点存储多个键值对,可以减少IO操作次数。

缺点

a. 消耗资源:在频繁的更新操作下,B+Tree需进行分裂和合并操作保持平衡,这会大幅消耗资源。

1.4 使用场景

B+Tree索引是数据库常见的索引类型之一,特别适用于大量数据的排序和查询场景。

2、Hash索引

2.1 原理

Hash索引是基于hash表实现,通过hash函数计算键值对的hash值,映射到一个桶中,桶中存储了所有hash值相同的数据行的指针,然后hash值和数据行指针存储在hash表中。查询时,mysql通过hash函数计算出查询条件的hash值,在hash表中找到hash值对应的桶,在桶中找到对应数据行的指针。

哈希冲突

当两个或多个键值映射到的同一个桶中的槽位时,则就发生hash冲突。hash冲突时 通过链表解决

2.2 特点

a. hash索引的查询效率理论比B+Tree索引快,因为可以通过hash值直接定位数据,无需B+Tree逐层查找。

b. hash索引只能用于对等比较(=、in),不支持范围查询(between、<、>、…)。

c. 对于联合索引,hash索引不能使用部分索引键查询(要么全部使用、要么全部不使用)。

d. 无法避免全表扫描,即每次都要全表扫描。

2.3 优缺点

优点

a. 查询速度快:只需一次hash运算就能定位到数据。

缺点

a. 不支持范围查询:由于hash索引是基于hash值定位的,因此无法直接用于范围查询。

b. 不支持排序操作:hash索引无法利用索引进行查询。

c. 稳定性差:在hash冲突严重情况下,性能下降厉害。

2.4 使用场景

hash索引适用于等值查询场景,如查询某个特定用户的记录。

3、Full-Text索引

3.1 原理

通过建立倒排索引(Inverted Index)构建Full-Text索引,提高数据的检索效率。

倒排索引是一种将文档中的单词或汉字映射到其出现位置的数据结构,主要用来解决判断字段的值中是否包含某字符或汉字的问题。

对于简单的业务或数据量小的业务,可以通过Like关键字判断,对于大数据量的业务,使用like效率大大降低,可以使用Full-Text索引。

InnoDB在5.6之后只支持英文的全文索引,不支持中文索引。可以通过内置分词器(ngram)来支持中文索引。

ngram分词器在建立索引时会对字段中的值进行分词,在进行查询时也会对要查询的内容分词。

中文检索执行过程:输入的查询内容 ——> SQL执行引擎 ——> ngram对内容分词 ——> 把分词后的词依次的去倒排索引中查找 ——> 将查询的记录返回。

3.2 特点

a. Full-Text索引是为了更快的进行文本搜索而设计的特殊类型索引。

b. 适用于包含大量文本的列,如文章、评论或描述性字段的查询。

3.3 优缺点

优点

a. 支持全文检索:可以搜索文本中的词汇而非整个字符串的匹配。

b. 灵活的搜索方式:支持自然语言搜索和布尔搜索。

缺点

a. 占用磁盘空间:Full Text索引会占用一定的索引空间。

b. 数据插入开销大:在创建索引时需对文本进行分词处理。

3.4 使用场景

在搜索引擎、内容管理系统等文本密集性应用场景中非常实用。

4、R-Tree(树)索引

4.1 原理

R-树是B-树在高维度空间的扩展,也是一颗平衡树。每个R树的叶子结点包含了多个指向不同数据的指针,这些数据可以是存放在硬盘中的,也可以是存在内存中。根据R树的这种数据结构,当我们需要进行一个高维空间查询时,我们只需要遍历少数几个叶子结点所包含的指针,查看这些指针指向的数据是否满足要求即可。这种方式使我们不必遍历所有数据即可获得答案,效率显著提高。如图:

                        

R-树运用了空间分割的理念,采用一种MBR(Minimal Bounding Rectangle)的方法将空间数据分割成多个矩形区域。每个节点可以表示一个矩形区域,同时可以包含其他节点或数据项。这种层级结构允许Mysql在空间查询中更快的定位到所需的数据,减少搜索范围,从而提高查询速度。

4.2 特点

a. R-树是B-树向多维空间发展的一种方式,用于处理多维数据。

b. 将对象空间进行矩形划分,每个节点都对应一个矩形区域。

4.3 优缺点

优点

a. 高效的空间查询:通过空间划分和索引,可以快速定位空间对象。

b. 支持多维数据:R-树可以处理二位或多维数据。

缺点

a. 在数据密集或重叠较多的情况下,索引使用效率会降低。

4.4 使用场景

R-树索引特别适用于地理空间数据的索引,如点、线、面等空间对象的索引。

三、总结

以上四种索引结构各有其特点和适用场景。B+树索引是数据库中最常用的索引类型之一,适用于大量数据的排序和搜索;Hash索引适用于等值查询且查询速度快;R-树索引特别适用于地理空间数据的索引;Full Text索引则适用于文本密集型应用的全文搜索。在选择索引类型时,需要根据具体的应用场景和数据特点来决定。

参考:

从B树、B+树、B*树谈到R 树-CSDN博客

MySQL索引1——索引基本概念与索引结构(B树、R树、Hash等)_mysql索引b树和hash-CSDN博客

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1961668.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

python inf是什么意思

INF / inf&#xff1a;这个值表示“无穷大 (infinity 的缩写)”&#xff0c;即超出了计算机可以表示的浮点数的范围&#xff08;或者说超过了 double 类型的值&#xff09;。例如&#xff0c;当用 0 除一个整数时便会得到一个1.#INF / inf值&#xff1b;相应的&#xff0c;如果…

卡码网KamaCoder 103. 水流问题

题目来源&#xff1a;103. 水流问题 C题解&#xff1a;从边界往高处走&#xff0c;走过的地方做标记。第一组边界跟第二组边界能走到的地方取交集。 代码来源代码随想录。&#xff08;虽然思路一样&#xff0c;但人家代码写得比我好哇&#xff09; #include <iostream>…

pyinstaller带浏览器一起打包playwright 独立运行exe

前置条件 没有安装自带环境&#xff0c;则 playwright install 安装了自带的浏览器 查看playwright的浏览器的位置 playwright install --dry-run 打开此文件夹可以看到 新建一个多层级目录playwright\driver\package.local-browsers 然后复制chromium-1124到playwright\dr…

听说它可以让代码更优雅

一提到静态代码检查工具这个词应该比较好理解&#xff0c;所谓静态代码检查工具就是检查静态代码的工具&#xff0c;完美~ 言归正传&#xff0c;相信很多程序员朋友都听说过静态代码检查工具这个概念&#xff0c;它可能是我们IDE里的某一个插件&#xff0c;可能是计算机中的一…

比 faster-whisper 至少快10倍的音视频转换文字

背景介绍 前两天我自己玩玩搞搞一个音频转文字服务&#xff0c;基于 faster-whisper&#xff0c;本想着这个已经是很快的了&#xff0c;没想到还有比它更快的&#xff0c;今天就来介绍使用一下。 FunClip&#xff0c;是阿里巴巴推出的一个智能视频剪辑工具&#xff0c;它结合…

计算机毕业设计选题推荐-某炼油厂盲板管理系统-Java/Python项目实战

✨作者主页&#xff1a;IT研究室✨ 个人简介&#xff1a;曾从事计算机专业培训教学&#xff0c;擅长Java、Python、微信小程序、Golang、安卓Android等项目实战。接项目定制开发、代码讲解、答辩教学、文档编写、降重等。 ☑文末获取源码☑ 精彩专栏推荐⬇⬇⬇ Java项目 Python…

[Bugku] web-CTF靶场详解!!!

平台为“山东安信安全技术有限公司”自研CTF/AWD一体化平台&#xff0c;部分赛题采用动态FLAG形式&#xff0c;避免直接抄袭答案。 平台有题库、赛事预告、工具库、Writeup库等模块。 ------------------------------- Simple_SSTI_1 启动环境&#xff1a; 页面提示传入参数f…

【Qt】QLCDNumberQProgressBarQCalendarWidget

目录 QLCDNumber 倒计时小程序 相关属性 QProgressBar 进度条小程序 相关设置 QLCDNumber QLCDNumber是Qt框架中用于显示数字或计数值的小部件。通常用于显示整数值&#xff0c;例如时钟、计时器、计数器等 常用属性 属性说明intValueQLCDNumber显示的初始值(int类型)va…

【全面介绍下Gitea,什么是Gitea?】

&#x1f308;个人主页: 程序员不想敲代码啊 &#x1f3c6;CSDN优质创作者&#xff0c;CSDN实力新星&#xff0c;CSDN博客专家 &#x1f44d;点赞⭐评论⭐收藏 &#x1f91d;希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出指正&#xff0c;让我们共…

这几个高级爬虫软件和插件真的强!

亮数据&#xff08;Bright Data&#xff09; 亮数据是一款强大的数据采集工具&#xff0c;以其全球代理IP网络和强大数据采集技术而闻名。它能够轻松采集各种网页数据&#xff0c;包括产品信息、价格、评论和社交媒体数据等。 网站&#xff1a;https://get.brightdata.com/we…

ubuntu安装并配置flameshot截图软件

参考&#xff1a;flameshot key-bindins 安装 sudo apt install flameshot自定义快捷键 Settings->Keyboard->View and Customize Shortcuts->Custom Shortcuts&#xff0c;输入该快捷键名称&#xff08;自定义&#xff09;&#xff0c;然后输入command&#xff08;…

RFID物流智能锁在物流锁控领域的意义与应用

在当今全球化和电子商务迅速发展的时代&#xff0c;物流行业作为经济的重要支撑&#xff0c;面临着日益增长的安全、效率和管理需求。物流锁控作为保障货物在运输过程中安全与完整的关键环节&#xff0c;传统的机械锁和简单电子锁已经难以满足现代物流复杂多变的业务场景。 一、…

前缀表达式(波兰式)和后缀表达式(逆波兰式)的计算方式

缀是指操作符。 1. 前缀表达式&#xff08;波兰式&#xff09; &#xff08;1&#xff09;不需用括号&#xff1b; &#xff08;2&#xff09;不用考虑运算符的优先级&#xff1b; &#xff08;3&#xff09;操作符置于操作数的前面。&#xff08;如 3 2 &#xff09; 1.1 中…

3.5.3、查找和排序算法-插入类排序和选择类排序

术语说明 稳定&#xff1a;如果a原本在b前面&#xff0c;而ab,排序之后a仍然在b的前面&#xff1b; 不稳定&#xff1a;如果a原本在b的前面&#xff0c;而ab,排序之后a可能会出现在b的后面&#xff1b; 例如&#xff1a;数组{1,2,3,3,4,7,6}。如果排序后&#xff0c;两个3的位…

【嵌入式之RTOS】死锁问题详解

目录 一、什么是死锁 二、产生死锁的四个必要条件 三、避免死锁的方法 四、实际应用中的考虑 一、什么是死锁 死锁&#xff08;Deadlock&#xff09;是多任务或多线程环境中一个常见的问题&#xff0c;尤其是在实时操作系统&#xff08;RTOS&#xff09;中&#xff0c;如果…

kvm虚拟化平台部署

kvm虚拟化平台部署 kvm概念简介 kvm自linux2.6版本以后就整合到内核中&#xff0c;因此可以看做是一个原生架构. kvm虚拟化架构 硬件底层提供物理层面的硬件支持 linux&#xff08;host&#xff09;&#xff0c;就相当于这个架构中的宿主机&#xff0c;上面运行了多个虚拟机。…

替换后端国外身份目录服务,宁盾身份域管接管FileNet助力国产化升级

IBM FileNet 是一款优秀的企业内容管理解决方案&#xff0c;为客户提供了领先的文档管理和流程管理集成环境&#xff0c;被大量企业所采用。FileNet 需要使用企业级的目录服务器&#xff08;LDAP&#xff09;作为其用户管理系统&#xff0c;满足其认证和授权的需求。对于 LDAP …

最高200万!苏州成都杭州的这些AI政策补贴,你拿到了吗?

随着全球人工智能技术的迅猛发展&#xff0c;地方政府纷纷出台相关政策以抢占未来科技的制高点。苏州 成都 杭州这三个城市更是推出了一系列AI政策补贴&#xff0c;旨在通过多方面支持&#xff0c;推动本地AI产业的发展。本文将带你了解目前不完全统计到的苏州 成都 杭州三地AI…

【Vulnhub系列】Vulnhub_pipe 靶场渗透(原创)

【Vulnhub系列靶场】Vulnhub-pipe 靶场渗透 原文转载已经过授权 原文链接&#xff1a;Lusen的小窝 - 学无止尽&#xff0c;不进则退 (lusensec.github.io) 一、环境配置 1、解决IP扫描不到问题 2、打开虚拟机&#xff0c;并修改网络连接模式为【NAT】即可 二、信息收集 1…

Python实战——轻松实现动态网页爬虫(附详细源码)

大家好&#xff0c;我是东眠的鱼&#xff0c;专注原创&#xff0c;致力于用浅显易懂的语言分享爬虫、数据分析及可视化等干货&#xff0c;希望人人都能学到新知识。<文末附带精品籽料哦&#xff0c;也可以和博主一起学Python呀&#xff01;> 项目背景 有同学自学爬虫时…