常见索引类型

article/2025/9/20 23:23:41

日常开发工作中,涉及到的数据存储,要做查询优化或想深入了解存储引擎,需要对索引知识有个起码的了解,下面介绍下最常见的四种索引结构。

  • 位图索引
  • 哈希索引
  • BTREE索引
  • 倒排索引

1、位图索引(BitMap)

位图索引适用于字段值为可枚举的有限个数值的情况

位图索引使用二进制的数字串(bitMap)标识数据是否存在,1标识当前位置(序号)存在数据,0则表示当前位置没有数据。
在这里插入图片描述

​图1 为用户表,存储了性别和婚姻状况两个字段。

​图2中 分别为性别和婚姻状态建立了两个位图索引;

例如:性别->男对应索引为:101110011,表示第1、3、4、5、8、9个用户为男性。其他属性以此类推。

使用位图索引查询:

男性 并且已婚 的记录 = 101110011 & 11010010 = 100100010,即第1、4、8个用户为已婚男性。

女性 或者未婚的记录 = 010001100 | 001010100 = 011011100, 即第2、3、5、6、7个用户为女性或者未婚。

注:位图索引查询主要进行“与/或”操作,性能非常高;并且空间占用少;一个常见的场景就是用着统计标签化用户上,对用户进行分类;Redis提供了方便的位图操作命令,使用很方便;但位图“位资源”的回收不方便,且稀松的位图会浪费空间,位图进行非运算较困难

2、哈希索引

顾名思义,是指使用某种哈希函数实现key->value 映射的索引结构。

哈希索引适用于等值检索,通过一次哈希计算即可定位数据的位置。

下图3 展示了哈希索引的结构,与JAVA中HashMap的实现类似,是用冲突表的方式解决哈希冲突的。

在这里插入图片描述

3、BTREE索引

BTREE索引是关系型数据库最常用的索引结构,方便了数据的查询操作。

BTREE: 有序平衡N叉树, 每个节点有N个键值和N+1个指针, 指向N+1个子节点

一棵BTREE的简单结构如下图4所示,为一棵2层的3叉树,有7条数据:

在这里插入图片描述

以Mysql最常用的InnoDB引擎为例,描述下BTREE索引的应用。

在这里插入图片描述

Innodb下的表都是以索引组织表形式存储的,也就是整个数据表的存储都是B+tree结构的,如图5所示。

​主键索引为图5的左半部分(如果没有显式定义自主主键,就用不为空的唯一索引来做聚簇索引,如果也没有唯一索引,则innodb内部会自动生成6字节的隐藏主键来做聚簇索引),叶子节点存储了完整的数据行信息(以主键 + row_data形式存储)。

​二级索引也是以B+tree的形式进行存储,图5右半部分,与主键不同的是二级索引的叶子节点存储的不是行数据,而是索引键值和对应的主键值,由此可以推断出,二级索引查询多了一步查找数据主键的过程。

​维护一颗有序平衡N叉树,比较复杂的就是当插入节点时节点位置的调整,尤其是插入的节点是随机无序的情况;而插入有序的节点,节点的调整只发生了整个树的局部,影响范围较小,效率较高。

可以参考红黑树的节点的插入算法:https://en.wikipedia.org/wiki/Red%E2%80%93black_tree

​因此如果innodb表有自增主键,则数据写入是有序写入的,效率会很高;如果innodb表没有自增的主键,插入随机的主键值,将导致B+tree的大量的变动操作,效率较低。这也是为什么会建议innodb表要有无业务意义的自增主键,可以大大提高数据插入效率。

Mysql Innodb使用自增主键的插入效率高。

使用类似Snowflake的ID生成算法,生成的ID是趋势递增的,插入效率也比较高。

4、倒排索引(反向索引)

​倒排索引也叫反向索引,可以相对于正向索引进行比较理解。

​正向索引反映了一篇文档与文档中关键词之间的对应关系;给定文档标识,可以获取当前文档的关键词、词频以及该词在文档中出现的位置信息,如图6 所示,左侧是文档,右侧是索引。

在这里插入图片描述

​ 反向索引则是指某关键词和该词所在的文档之间的对应关系;给定了关键词标识,可以获取关键词所在的所有文档列表,同时包含词频、位置等信息,如图7所示。

图7

​ 反向索引(倒排索引)的单词的集合和文档的集合就组成了如图8所示的”单词-文档矩阵“,打钩的单元格表示存在该单词和文档的映射关系。

图8

倒排索引的存储结构可以参考图9。其中词典是存放的内存里的,词典就是整个文档集合中解析出的所有单词的列表集合;每个单词又指向了其对应的倒排列表,倒排列表的集合组成了倒排文件,倒排文件存放在磁盘上,其中的倒排列表内记录了对应单词在文档中信息,即前面提到的词频、位置等信息。

图9

下面以一个具体的例子来描述下,如何从一个文档集合中生成倒排索引。
如图10,共存在5个文档,第一列为文档编号,第二列为文档的文本内容。

图10

将上述文档集合进行分词解析,其中发现的10个单词为:[谷歌,地图,之父,跳槽,Facebook,加盟,创始人,拉斯,离开,与],以第一个单词”谷歌“为例:首先为其赋予一个唯一标识 ”单词ID“, 值为1,统计出文档频率为5,即5个文档都有出现,除了在第3个文档中出现2次外,其余文档都出现一次,于是就有了图11所示的倒排索引。

在这里插入图片描述


http://chatgpt.dhexx.cn/article/imdARiOE.shtml

相关文章

数据库的五种索引类型

本文从如何建立mysql索引以及介绍mysql的索引类型,再讲mysql索引的利与弊,以及建立索引时需要注意的地方 首先:先假设有一张表,表的数据有10W条数据,其中有一条数据是nicknamecss,如果要拿这条数据的话需要些的sql是 SELECT * FROM award WHERE nickname css 一般情况下,在没…

mysql索引有哪些类型?

MySQL目前主要有的索引类型为:普通索引、唯一索引、主键索引、组合索引、全文索引。 通过给字段添加索引可以提高数据的读取速度,提高项目的并发能力和抗压能力。索引优化时mysql中的一种优化方式。索引的作用相当于图书的目录,可以根据目录…

你知道多少种索引?

前言 嗨,大家好,我是fancy呀。 在工作中我们常常用到索引,无论是普通索引还是唯一索引,都是一些常用的索引方式,目的就是为了提高查询效率,避免业务请求超时等问题。那么,当你在使用索引的时候…

动态规划算法 | 最长递增子序列

通过查阅相关资料发现动态规划问题一般就是求解最值问题。这种方法在解决一些问题时应用比较多,比如求最长递增子序列等。 有部分人认为动态规划的核心就是:穷举。因为要求最值,肯定要把所有可行的答案穷举出来,然后在其中找最值…

求最长递增子序列个数——C++

声明:本文原题主要来自力扣,记录此博客主要是为自己学习总结,不做任何商业等活动! 一、下面是原题描述 给定一个未排序的整数数组,找到最长递增子序列的个数。 示例 1: 输入: [1,3,5,4,7] 输出: 2 解释: 有两个最长递…

最长递增子序列(LIS)

最长递增子序列(LIS) 问题描述: 求一个序列的最长递增子序列,这样的子序列是允许中间越过一些字符的,即留“空”。 例如:4 2 3 1 5 的最长递增子序列为 2 3 5,长度为 3 。 解法:…

【Leetcode】最长递增子序列问题及应用

文章目录 最长递增子序列问题及应用300. 最长递增子序列面试题 17.08. 马戏团人塔354. 俄罗斯套娃信封问题面试题 08.13. 堆箱子1691. 堆叠长方体的最大高度406. 根据身高重建队列 最长递增子序列问题及应用 300. 最长递增子序列 请参考 【Leetcode】计算最长系列&#xff08…

输出最长递增子序列

目录 题目: 输入描述: 输出描述: 示例1 输入 输出 示例2 输入 输出 说明 备注: 思路分析: 改进: 得到最长子序列: 易错点: 代码展示: 题目: 给定数组arr,设长度为n&…

NC91 最长递增子序列

NC91 最长递增子序列 这道题n的范围是1e5,因此不能使用常规的dp[i],表示以i结尾的最大的子序列,因为这个时间复杂度是n方级别。因此要换一种算法。 贪心二分,时间复杂度为O(nlogn) 下面说说贪心二分的解法,举例说明基…

Vue3 最长递增子序列详解

Vue3 最长递增子序列研究 本文初衷 彻底讲清楚 Vue3 源码中实现最长递增子序列的算法。 概念名词 **最长递增子序列:**在一个给定的数值序列中,找到一个子序列,使得这个子序列元素的数值依次递增,并且这个子序列的长度尽可能地…

Java 最长递增子序列_最长递增子序列问题 Java

最长递增子序列问题 LIS(longest increasing subsequence) 例如 给定一个数列,长度为N, 求这个数列的最长上升(递增)子数列(LIS)的长度. 以 1, 7, 2, 8, 3, 4 为例。 这个数列的最长递增子数列是 1 2 3 4,长度为4; 次长的长度为3&…

最长递增子序列

问题 给定一个长度为N的数组,找出一个最长的单调自增子序列(不一定连续,但是顺序不能乱)。例如:给定一个长度为6的数组A{5, 6, 7, 1, 2, 8},则其最长的单调递增子序列为{5,6,7,8},长度为4. 解法1:最长公共子序列法 这个问题可以转换为最长公共子序列问题。如…

动态规划设计方法详解最长递增子序列

很多读者反应,就算看了前文动态规划详解,了解了动态规划的套路,也不会写状态转移方程,没有思路,怎么办?本文就借助「最长递增子序列」来讲一种设计动态规划的通用技巧:数学归纳思想。 最长递增…

最长递增子序列(Longest Increasing Subsequence)

定义 最长上升子序列(Longest Increasing Subsequence,LIS),在计算机科学上是指一个序列中最长的单调递增的子序列。 问题描述 给定一个长度为 N 的数组,找出一个最长的单调自增子序列(不一定连续&#…

最长递增子序列问题(你真的会了吗)

目录 一.最长递增子序列问题I 二.最长递增子序列问题II 三. 最长递增子序列问题III 一.最长递增子序列问题I 1.对应牛客网链接 最长上升子序列(一)_牛客题霸_牛客网 (nowcoder.com) 2.题目描述: 3.解题思路 1.首先我们分析题意:最长递增子序列拆&#x…

UDP协议详细解析

一、基本概念 基本定义:UDP 是User Datagram Protocol的简称, 中文名是用户数据报协议,是OSI(Open System Interconnection,开放式系统互联) 参考模型中一种无连接的传输层协议,提供面向事务的…

tcp read 和 udp recvfrom

udp中写一个长度为0的数据报是可行的,这导致一个包含IP头部、udp头部和没有数据的IP数据报。这也意味着对于数据报协议,recvfrom返回0值也是可行的:它不表示对方已经关闭了连接,这与tcp套接口上read返回0值的情况不同。由于udp是无…

UDPTCP

目录 Socket 一.UDP 特点 基于UDP实现回显服务器 服务器 客户端 端口冲突 图解 二.TCP 特点 基于TCP实现回显服务器 服务器 客户端 图解 Socket Socket套接字,是由系统提供用于网络通讯的技术,是基于TCP/IP协议的网络通信的基本操作单元,基于…

Reliable UDP

Reliable UDP(可靠的UDP)是一套服务品质的增强,比如拥挤控制调整,数据重传,薄化服务器算法等,这些增强可以提高服务器在数据包丢失和网络拥挤的条件下向RTP客户表现品质良好的RTP流的能力。Reliable UDP’的…

TCP /UDP

TCP与UDP工作在传输层,在程序之间传数据(视频,聊天,图片,网页) TCP基于连接的,可靠的(及时知对方接受/拒绝,是否传错)(文本,网页&…