谈谈MySQL的索引

索引其实是MySQL里面的内容,而且我感觉是很高频的。我看了好多关于索引的文章,但是总感觉很困惑,虽然我之前在面试的时候没有被问过,但是我总感觉这很重要。而且,我希望将这个知识点有条理、有逻辑的说出来,而不是简单的几句话概括。

索引常见的模型有3种:哈希表,有序数组和树。

我们来看一个场景:假如现在有一张数据表(表中仅含有身份证号和名字字段的表),我要为这张数据表建立一个索引,那我应该如何选择索引模型呢?

假如我选择哈希表,那最大的好处是,当我添加一条数据进入数据表时,哈希表很容易对这张数据表同步,同步的方式就是直接追加写入哈希表既可。但是哈希表这种索引模型只适合那种查询一个数据的,你如果说想查询4406812020612001~4406812020612020这个区间的身份证号各自对应的姓名,那就比较麻烦了,你就只能通过20次哈希运算。因为你的哈希表是散列的,你不知道这20条数据都散落在哈希表中的哪些地方,你只能通过哈希运算来定位。

假如用有序数组做索引模型会怎么样?如果用有序数组做索引模型的话,无论是等值查询还是区间查询都非常好,但问题是如果我插入一条数据到数据表,那有序数组肯定会对数据进行同步嘛。如果这条数据是在中间插进有序数组中的,那就要挪动后面所有的元素,那太麻烦了。

所以我们想到了用树。树有很多种,我们先从二叉排序树讲起。

如果你用二叉排序树做索引模型的话,假如数据表中新增的数据都是有序的,那你二叉排序树就退化成了链表,那怎么办?

这时候我们就想到了用二叉平衡树做索引模型,二叉平衡树就是防止数据插入数据表有序而退化为链表的。但是二叉平衡树每次插入一个节点都要判断树是否平衡,效率太低了,怎么办?

我们又想到了用红黑树做索引模型,其实红黑树是一种特殊的平衡二叉树,而且对于调整树的条件相对没有一般的平衡二叉树严格。但用红黑树做索引模型其实也有问题,假如数据表中数据太大的话,这棵红黑树也很大,一次性根本放不进内存,怎么办?

B树!B树最大的特点是一个节点可以有多个数据,如果我们用B树做索引模型的话,那我们在将树载入内存的时候就可以一个节点一个节点的载入,这就可以放进内存了。但是问题又来了,因为B树每个节点都有value,区间查询的时候,很有可能会跨层访问,这会比较麻烦,有没有更好的索引模型呢?

B+树。B+树只有叶子节点有value,而非叶子节点都是key。同时,对于叶子节点,还用了链表连接起来,这样区间查询超级快。所以用B+树来作为索引模型是一个非常好的选择。

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

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

相关文章

Cmake和opencv环境安装

1 Cmake下载及安装 Download CMake 根据需要下载,历史版本下载方法如下 CMake 的版本号中的后缀 "rc1" 和 "rc2" 表示 Release Candidate 1 和 Release Candidate 2,它们都是候选版本,用于测试新功能和修复 bug。通常情…

突破编程_C++_C++11新特性(type_traits的属性类型特性以及操作类型特性)

1 type_traits 的属性类型特性 1.1 std::alignment_of std::alignment_of 是一个模板类&#xff0c;用于获取类型的对齐要求。对齐是指数据在内存中的位置&#xff0c;某些硬件平台可能要求特定类型的数据位于特定地址的边界上。 定义&#xff1a; template< class T &g…

Github 2024-03-23 Rust开源项目日报 Top10

根据Github Trendings的统计,今日(2024-03-23统计)共有10个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量Rust项目10Dart项目1RustDesk: 用Rust编写的开源远程桌面软件 创建周期:1218 天开发语言:Rust, Dart协议类型:GNU Affero General Public Li…

在离线的arm架构kylin v10服务器上使用Kuboard-Spray搭建K8S集群

在离线的arm架构kylin v10服务器上使用Kuboard-Spray搭建K8S集群 在内网项目中需要安装K8S集群&#xff0c;经过调研&#xff0c;选择使用Kuboard-Spray工具搭建K8S集群&#xff0c;降低学习成本&#xff0c;提高安装效率。 为了简化安装使用集群的过程&#xff0c;搭建了私有…

云计算 3月18号 (mysql安装及操作)

一、Mysql 1.1 MySQL数据库介绍 1.1.1 什么是数据库DB&#xff1f; DB的全称是database&#xff0c;即数据库的意思。数据库实际上就是一个文件集合&#xff0c;是一个存储数据的仓库&#xff0c;数据库是按照特定的格式把数据存储起来&#xff0c;用户可以对存储的数据进行…

Docker 容器中使用 RAM 角色实现云监控事件监控

准备工作 在开始之前,请确保您已经完成以下准备工作: 创建一个 RAM 角色,并为该角色授予 ​​AliyunCloudMonitorFullAccess​​ 权限。这将允许该角色执行云监控服务的所有操作,包括发送自定义事件。准备一个 Python 应用程序,用于发送自定义事件到云监控服务。您可以使用我们…

jupyter notebook和jupyter lab 找不到虚拟环境

文章目录 这里以环境Pytorch为例&#xff1a; 激活环境 conda activate Pytorch在你的环境中安装 ipykernel&#xff1a; conda install ipykernel将你的环境添加到 Jupyter 的内核列表中&#xff1a; python -m ipykernel install --user --namePytorch

spring boot高级运用:使用Spring Kafka集成Apache Kafka,实现消息的生产和消费。

使用Spring Kafka集成Apache Kafka&#xff0c;实现消息的生产和消费。 要使用Spring Kafka集成Apache Kafka来实现消息的生产和消费&#xff0c;您需要进行以下步骤&#xff1a; 添加Spring Kafka依赖&#xff1a; 在您的Spring Boot项目中&#xff0c;首先需要添加Spring …

Java面试题:结合设计模式与并发工具包实现高效缓存;多线程与内存管理优化实践;并发框架与设计模式在复杂系统中的应用

探索Java高级编程&#xff1a;综合性面试题解析 Java作为一门功能强大的编程语言&#xff0c;在企业级应用开发中占据着举足轻重的地位。本文将深入探讨Java设计模式、内存管理、多线程工具类、并发工具包和并发框架等高级知识点&#xff0c;通过三道综合性的面试题&#xff0…

Python 从0开始 一步步基于Django创建项目(4)应用Django shell查看数据模型

Django shell是Django提供的交互式环境&#xff0c;可以通过编程的方式查看数据模型中的数据。 在《Python 从0开始 一步步基于Django创建项目&#xff08;3&#xff09;》中已经向数据模型city&#xff0c;添加了两条数据&#xff1a;‘北京’、‘墨尔本’。又向数据模型entr…

2、事件修饰符、双向绑定、style样式使用、v-for循环遍历、v-if 和 v-show

一、事件修饰符 1、.stop 阻止冒泡事件 给谁加了阻止冒泡事件&#xff0c;谁下面的盒子就不会执行了 <div id"app"><div class"parent" click"log3"><div class"child" click"log2"><button click.…

AI:151-使用机器学习技术进行信用风险评估与管理

收录于专栏:精通AI实战千例专栏合集 从基础到实践,深入学习。无论你是初学者还是经验丰富的老手,对于本专栏案例和项目实践都有参考学习意义。 ✨✨✨ 每一个案例都附带关键代码,详细讲解供大家学习,希望可以帮到大家。正在不断更新中~ 一.机器学习在信用风险评估与管理中…

python蓝桥杯-算法训练 印章、拿金币、数字游戏

一、印章 问题描述 共有n种图案的印章&#xff0c;每种图案的出现概率相同。小A买了m张印章&#xff0c;求小A集齐n种印章的概率。 输入格式 一行两个正整数n和m 输出格式 一个实数P表示答案&#xff0c;保留4位小数。 样例输入 2 3 样例输出 0.7500 数据规模和约定 1≤…

pytest之yaml格式测试用例读写封装

pytest之yaml格式测试用例读写封装 pytest之parametrize&#xff08;&#xff09;实现数据驱动YAML格式测试用例读/写/清除/封装结构类型Maps类型数组类型 pytestparametrizeyamltest_api.pyget_token.yaml pytest之parametrize&#xff08;&#xff09;实现数据驱动 pytest.ma…

LeetCode_32_困难_最长有效括号

文章目录 1. 题目2. 思路及代码实现详解&#xff08;Java&#xff09;2.1 动态规划2.2 不需要额外空间的算法 1. 题目 给你一个只包含 ( 和 ) 的字符串&#xff0c;找出最长有效&#xff08;格式正确且连续&#xff09;括号 子串 的长度。 示例 1&#xff1a; 输入&#xff…

Oracle Data Guard常用命令

--查询数据库角色和保护模式 select database_role,switchover_status from v$database; --切换备库为主库&#xff08;切换后&#xff0c;主库为mount状态&#xff09; --TO PRIMARY alter database commit to switchover to primary; --SESSIONS ACTIVE alter database comm…

springcloud+nacos服务注册与发现

快速开始 | Spring Cloud Alibaba 参考官方快速开始教程写的&#xff0c;主要注意引用的包是否正确。 这里是用的2022.0.0.0-RC2版本的springCloud&#xff0c;所以需要安装jdk21&#xff0c;参考上一个文章自行安装。 nacos-config实现配置中心功能-CSDN博客 将nacos-conf…

Head First Design Patterns -模板方法模式

什么是模板方法模式 在一个方法中定义一个算法的骨架&#xff0c;而把一些步骤延迟到子类。模板方法使得子类可以在不改变算法结构的情况下&#xff0c;重新定义算法的某些步骤。 这些算法步骤中的一个或者多个被定义为抽象的&#xff0c;由子类实现。 类图 代码 书中用泡茶和…

C# 编程语言中访问修饰符(access modifiers)

C#访问修饰符 protected 访问修饰符&#xff1a;1. public 访问修饰符&#xff1a;2. private 访问修饰符&#xff1a;3. internal 访问修饰符&#xff1a;4. protected internal 访问修饰符&#xff1a; 在 C# 编程语言中&#xff0c;有多个访问修饰符&#xff08;access modi…

kotlin中使用myibatis-plus的lambdaQuery的问题

kotlin中使用myibatis-plus的lambdaQuery的问题 代码&#xff1a;lambdaQuery().eq(User::username, username).one()报错&#xff1a;org.apache.ibatis.reflection.ReflectionException: Error parsing property name register$lambda$0. Didnt start with is, get or set.解…