【MySQL】数据库索引 - 浅谈索引类型

news2024/11/20 13:34:17

索引类型可以分为哈希表、有序数组和 N 叉树

不管是哈希还是有序数组,或者 N 叉树,它们都是基于其自身数据结构的特性来提高读写速度。在 NoSQL 里面还运用到了 LSM 树,来提高写的速度,还有跳表等数据结构来进行优化。

不过需要关注的是,数据库底层存储的核心就是基于数据模型的。通过这些数据模型,才能分析这个数据库到底适用于什么场景。

这里只浅谈了三种类型的索引类型,索引的目的是来提高数据查询的效率,不同的数据类型终究是时间与空间的 trade off

下面的例子都基于学生的数据存储,假设学生表的索引是学号,格式为 idx_stu_no。索引后面文章,相关的例子也是用这个学生的数据存储。

idstu_nostu_name
11001张三
21002李四
31010王五
41003赵六
哈希表

哈希表是一种以 key-value 存储数据的结构,即输入 key 得到 value。

哈希表的思路就是把 value 放到数组里面,然后 value 存在哪位置,是通过哈希函数把 key 转换成一个位置。

哈希表的问题就是在 一定概率下,会造成哈希冲突。处理这种方式就是需要一个链表,如果哈希函数计算出来的值有重复,则往链表后面追加。可以通过下图理解:

假设分别插入1001,1002,1003,1010 。分别通过 HashFunc 计算出来的数组下标是,1,4,2,2。1003和1010在下标2里面,因此,下标2内以链表存储(其他只有一个的也是链表,只不过下图这么展示)

在这里插入图片描述

哈希表的缺点就是,因为 key 计算出来的位置不是有序的,所以哈希索引做区间查询的速度是很慢的。

因此,哈希表的适用场景就是等值查询的场景,比如一些缓存场景。

hash table 的实现,自己实现的一个简单的 hash table : hashTable zxmfke/train (github.com)

有序数组

有序数组的存储方式,就是 key 递增的形式存储在数组里面。

有序数字相较于哈希表的好处就是既能等值查询,也能范围查询(这种情况一般假定,key 都是唯一的)。

最简单的有序数组,就是通过遍历来找到要的 key,这个时间复杂度是O(N)。如果是范围查询,就需要找到 start key,然后遍历到 end key。

还有一种方式是通过二分法查找,时间复杂度是 O(log(N))。范围查找就可以先通过二分法查找到 start key,然后再向右遍历,直到小于等于 end key。

可以通过下图理解:

insert 1001,找到下标0

insert 1002,找到下标1

insert 1010,找到下标2

insert 1003,找到下标2

在这里插入图片描述

有序数组的缺点就是需要更新数据的时候就比较麻烦,中间插入一个数据,后面的数据都要向后挪一格,成本巨大。

因此,有序数组只适合静态存储引擎,比如一些历史数据,不会再改动的数据。

有序数组的源码实现,自己实现的一个简单的 ordered slice: orderedSlice · zxmfke/train (github.com)

N叉树

N叉树最初始的样子是二叉搜索树,二叉搜索树的实现就不在这边详细说了。

二叉搜索树的特点就是,每个节点的左二子小于父节点,父节点又小于右儿子,查询的时间复杂度为 O(log(N))。为了保证每次查询都是 O(log(N)),就要变成平衡二叉树,这样更新时间也会是 O(log(N))。

二叉树是搜索效率最高,但是实际不使用二叉树,因为索引不只存在在内存中,也有在磁盘上。

树可以有二叉,也可以有多叉,多叉树节点里面的儿子的大小也得保证是从左往右递增的。因此,为了保证少从磁盘读取数据,就不能使用二叉树,而是要使用 N叉树,这里的 N 取决于数据块的大小。N叉数由于在读写上的性能特点,以及适配磁盘的访问模式,更广泛地在数据库引擎中应用。

下图可以理解为N=2,一个二叉搜索树来插入上面的学生数据:

在这里插入图片描述


数据库底层存储的核心就是基于这些数据模型的。每碰到一个新的数据库,我们需要先关注它的数据模型,这样才能从理论上分析这个数据的适用场景。


资料来源

极客时间:mysql45讲
基于这些数据模型的。每碰到一个新的数据库,我们需要先关注它的数据模型,这样才能从理论上分析这个数据的适用场景。


资料来源

极客时间:mysql45讲

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

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

相关文章

数据结构与算法-java

什么是数组? (1)数组是计算机中最基本的数据结构之一,我们会用一些名为索引的数字来标识每项数据在数组中的位置。 (2)大多数编程语言中索引是从0开始的。 (3)数组在内存中是存在连续…

如何打造一个流式数据湖

Flink将数据写入到 hudi 准备阶段 启动hadoop集群(单机模式) ./sbin/start-all.shhdfs离开安全模式 hdfs dfsadmin -safemode leave启动hive 后台启动元数据 ./hive --service metastore &启动hiveserver2 ./hiveserver2 &执行sql语句之前…

fpga实操训练(ip rom)

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing 163.com】 altera的fpga本身自带了rom的ip,使用起来也十分方便。实际开发中,使用rom的场景也很多,比如一些默认的配置文件…

TensorFlow之回归模型-2

1 基本概念 回归模型 线性 线性模型 非线性模型 线性回归 逻辑回归 Log Loss(损失函数) 分类临界值 2 效率预测 回归问题是预测一个持续的值,主要是用于解决不确定性的问题,例如,一个商品在未来可能的价格或…

CMAKE_INSTALL_PREFIX

一、定义 CMAKE_INSTALL_PREFIX为cmake的内置变量,用于指定cmake执行install命令时,安装的路径前缀。Linux下的默认路径是/usr/local ,Windows下默认路径是 C:/Program Files/${PROJECT_NAME} 二、用…

dcloud如何苹果ios系统真机测试-HBuilderX真机运行ios测试

dcloud如何运行到IOS真机测试 1,下载安装iTunes 安装完毕后重新打开HBuilderX 2,点击运行真机 将iPhone 与电脑进行链接,点信任, 运行-运行到手机或模拟器-运行到IOS APP 基座 安装过itunes就会有显示,但是这里还有…

进程的学习 —— Linux下的进程

目录前言1 认识进程1.1 进程的概念1.2 进程的管理1.3 查看进程的两种方法1.4 getpid、getppid和fork函数2 进程状态2.1 普遍概念下的进程状态2.2 Linux下的进程状态2.2.1 测试Linux的各种进程状态2.2.2 僵尸进程2.3 孤儿进程3 进程切换与进程优先级3.1 并行、并发3.2 进程切换3…

kafka和sparkStreaming

1、Kafka 1、kafka集群架构 producer 消息生产者,发布消息到Kafka集群的终端或服务 broker Kafka集群中包含的服务器,一个borker就表示kafka集群中的一个节点 topic 每条发布到Kafka集群的消息属于的类别,即Kafka是面向 topic 的。 更通俗…

HDFS 常用命令

一、HDFS常用命令 1、查看版本 hdfs version 2、创建 HDFS 文件系统目录。 格式: hdfs dfs -mkdir /user/dir1 3、列出目录下的所有文件 类似 Linux Shell 的 ls 命令。用它可以列出指定目录下的所有文件 hdfs dfs -ls /user/ 4、把本地文件系统文件和目录拷贝…

整合Tkinter GUI界面的古诗词词云生成

Python语言提供的wordcloud词云功能,使文本数据的可视化,简单而美丽。但网上的大多数词云生成功能,多半没有可交互的GUI界面,使用起来稍觉不便。笔者结合网上的中文词云功能,以唐诗三百首,宋词三百首&#…

拟合算法(模型+代码)

拟合的结果是得到一个确定的曲线 最小二乘法的几何解释: argmin 存在参数k,b使括号里的值最小 第一种有绝对值,不易求导(求导在求最小值),计算较为复杂;所以我们往往使用第二种定义&#xff0…

什么软件可以录屏?这3款宝藏录屏软件,码住收藏

当我们处理剪辑视频时,我们需要使用到很多素材。有些素材我们可以直接从电脑网上进行下载。但有些素材我们在网上无法进行下载,这个时候就需要使用录屏软件进行录屏。什么软件可以录屏?今天小编向您分享3个宝藏录屏软件,赶紧码住收…

jmeter基础使用方法

文章目录一 配置环境变量二 Jmeter默认语言设置三 启动线程组的创建发送http请求数据报告一 配置环境变量 设置JMETER_HOME,及jemeter解压目录。 设置CLASSPATH,此处分别配置ApacheJMeter_core.jar和jorphan.jar所在位置。 关于环境变量配置多个值,在多个参数中间…

动态规划——状态压缩dp

文章目录概述状态压缩使用条件状压dp位运算棋盘(基于连通性)类问题概述例题蒙德里安的梦想小国王玉米田炮兵阵地集合类问题概述例题最短Hamilton路径愤怒的小鸟总结概述 状态压缩 状态压缩就是使用某种方法,简明扼要地以最小代价来表示某种…

MySQL 进阶篇2.0 存储过程 触发器 锁 InnoDB引擎

45.存储过程-介绍 46.存储过程-基本语法 -- 查看 select * from information_sc

Python中import语句用法详解

一. 什么是模块(module)? 在实际应用中,有时程序所要实现功能比较复杂,代码量也很大。若把所有的代码都存储在一个文件中,则不利于代码的复用和维护。一种更好的方式是将实现不同功能的代码分拆到多个文件…

案例丨多元业态管理服务厂商如何走通数字化转型之路

对于多元业态管理服务厂商来说,不同业态客户的使用习惯不一样,从而导致服务过程中的服务有所区别,是这类服务厂商数字化转型的核心需求。下面就以全国领先的阳光智博为例,看下他们是怎样数字化转型的。 一、企业介绍 阳光智博服务…

ASEMI整流二极管A7二极管和M7二极管能代换吗

编辑-Z A7二极管和M7二极管不仅外观封装很像,各项参数也是非常接近的,那么A7二极管和M7二极管能代换吗?我们先来看看他们的详细参数对比: A7二极管参数: 型号:A7二极管 封装:SOD-123 最大重…

Docker- 7.1、跨主机网络-macvlan

一、macvlan介绍 macvlan 本身是 linxu kernel 模块,其功能是允许在同一个物理网卡上配置多个 MAC 地址而实现虚拟多块网卡,即多个 interface,每个 interface 可以配置自己的IP。macvlan 本质上是一种网卡虚拟化技术。macvlan 的最大优点是性…

教你这样找到Mac“其他”文件并删除它

当我们通过「关于本机」>「存储空间」查看硬盘的空间占用情况时。系统会将存储空间根据不同文件类别所占的空间大小显示在条状图上,大部分类型看文字都比较好理解,但对于“其他”这一类很多小伙伴都感觉很困惑,会产生一些问题如&#xff1…