谈谈MYSQL索引

基本介绍

索引是帮助MySQL高效获取数据的数据结构,主要是用来提高数据检索的效率,降低数据库的IO成本,同时通过索引列对数据进行排序,降低数据排序的成本,也能降低了CPU的消耗。

通俗来说, 索引就相当于一本书的目录, 可以根据页码快速查找到指定的内容, 目的就是加快数据库的查询速度,但这也就意味着书中如果要增加一个章节,修改目录是比较麻烦的,使用索引适用于经常查询很少修改的业务

在 MySQL 中,通常有以下两种方式访问数据库表的行数据:

1) 顺序访问

  • 顺序访问是在表中实行全表扫描,从头到尾逐行遍历,直到在无序的行数据中找到符合条件的目标数据。
  • 顺序访问实现比较简单,但是当表中有大量数据的时候,效率非常低下。例如,在几千万条数据中查找少量的数据时,使用顺序访问方式将会遍历所有的数据,花费大量的时间,显然会影响数据库的处理性能。

2) 索引访问

  • 索引访问是通过遍历索引来直接访问表中记录行的方式。
  • 使用这种方式的前提是对表建立一个索引,在列上创建了索引之后,查找数据时可以直接根据该列上的索引找到对应记录行的位置,从而快捷地查找到数据。索引存储了指定列数据值的指针,根据指定的排序顺序对这些指针排序。

注意: 建立索引后, 查询速度不一定会变快,例如, 你在teacher表中建立了关于id的索引, 如果你按照name查询, 那么查询速度也不会变快,查询得用到你建立的索引

优缺点 

优点:

  •  创建索引可以大幅提高系统性能,帮助用户提高查询的速度;
  • 可以加速表与表之间的链接;
  • 降低查询中分组和排序的时间。

缺点:

  • 索引的存储需要占用磁盘空间;
  • 当数据的量非常巨大时,索引的创建和维护所耗费的时间也是相当大的;
  • 当每次执行create、update、delete操作时,索引也需要动态维护,降低了数据的维护速度。

空间换时间

 索引的底层数据结构

B树

B树树就是B-树,它是一种平衡的多叉树,不是B减树,而是B杠树,中文通常称为B树,英语称为B-tree。

人们可能会以为B-树是一种树,而B树又是一种一种树。而事实上是,B-tree就是指的B树。

B 树的结构如下图所示: 

B树的主要特点有:

  • B树的节点中存储着多个元素, 每个内节点有多个分叉.
  • 在所有的节点中都存储数据
  • 父节点当中的元素不会出现在子节点中.
  • 所有的叶子节点都位于同一层, 叶子节点具有相同的深度, 叶子节点之间没有指针连接.

上面那张图所表示的 B 树就是一棵 3 阶的 B 树。我们可以看下磁盘块 2,里面的关键字为(8,12),它 有 3 个孩子 (3,5),(9,10) 和 (13,15),你能看到 (3,5) 小于 8,(9,10) 在 8 和 12 之间,而 (13,15)大于 12,刚好符合刚才我们给出的特征。 然后我们来看下如何用 B 树进行查找。假设我们想要 查找的关键字是 9 ,那么步骤可以分为以下几步:

  • 我们与根节点的关键字 (17,35)进行比较,9 小于 17 那么得到指针 P1;
  • 按照指针 P1 找到磁盘块 2,关键字为(8,12),因为 9 在 8 和 12 之间,所以我们得到指针 P2;
  • 按照指针 P2 找到磁盘块 6,关键字为(9,10),然后我们找到了关键字 9。 

B 树相比于平衡二叉树来说磁盘 I/O 操作要少 , 在数据查询中比平衡二叉树效率要高。所以 只要树的高度足够低,IO次数足够少,就可以提高查询性能 。 

B+树 

B+树是B树的改造版, 他与B树的不同点有:

  • 所有的data在叶子节点出现, 内部节点不再存储data, 只存储key
  • 叶子节点之间使用双向指针连接, 最底层的叶子节点形成了一个双向有序链表, 方便进行范围查询.

B+树的查找与B树不同,当索引部分某个节点的关键字与所查的关键字相等时,并不停止查找,应继续沿着这个关键字左边的指针向下,一直查到该关键字所在的叶子节点为止。

B+树可以保证精确查询和范围查询的快速查找,MySQL的innodb存储引擎底层就是B+树.

为什么InnoDB选择B+树而不是B树:

    1、B+树的磁盘读取代价低, B树每个节点都有data,B+树只有叶子节才有,假设每个节点大小16KB,那么B+树比B树能存储更多的关键字,一次性读入内存的关键字的内存也会更多,B+树的高度也会比B树低,磁盘IO次数会更少。

    2、B+树对范围查询更友好,方便遍历,B树叶子节点没有链接,而B+树叶子节点通过双向指针链接,可以很方便的进行范围查询,比如where条件中 age >= 3 and age < 20,那么当找到3时就可以顺着指针找到20,而B树是不可以的。

    3、B+树查询效率稳定性更好, 在B+树中,由于分支节点并不是最终指向文件内容的节点,分支节点只是叶子节点的索引,所以对于任意关键字的查找都必须从根节点走到分支节点,所有关键字查询路径长度相同,每个数据查询效率相当。而对于B树而言,其分支节点上也保存有数据,对于每一个数据的查询所走的路径长度是不一样的,效率也不一样,B树稳定性不如B+树好

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

盘点25个Html游戏Game源码网页爱好者不容错过

盘点25个Html游戏Game源码网页爱好者不容错过 学习知识费力气&#xff0c;收集整理更不易。 知识付费甚欢喜&#xff0c;为咱码农谋福利。 下载链接&#xff1a;https://pan.baidu.com/s/1lSNLjWB4xMuLV8m_kDtczw?pwd6666 提取码&#xff1a;6666 项目名称 21点游戏 H5…

SpringBoot整合Kafka

SpringBoot整合Kafka 文章目录 SpringBoot整合Kafka下载与安装创建topic&#xff0c;测试生产消费程序SpringBoot整合Kafka导坐标做配置做客户端 下载与安装 下载地址&#xff1a; https://kafka.apache.org/downloads 下载2的版本&#xff0c;3.的版本会报错 解压安装&#x…

【大学英语视听说上】“智力”口语问答练习

题目&#xff1a; book 2, page 9, question 4 回答&#xff1a; 1: What do you think of the view “Intelligence must be bred, not trained”? I think this view is biased. The view suggests that intelligence is primarily determined by genetic factors and inh…

【大数据】HBase 中的列和列族

&#x1f60a; 如果您觉得这篇文章有用 ✔️ 的话&#xff0c;请给博主一个一键三连 &#x1f680;&#x1f680;&#x1f680; 吧 &#xff08;点赞 &#x1f9e1;、关注 &#x1f49b;、收藏 &#x1f49a;&#xff09;&#xff01;&#xff01;&#xff01;您的支持 &#x…

类和对象(上篇)

类和对象 面向过程和面向对象的区别&#xff1a;结构体变为类类的一些性质类的访问限定符类的实体化类对象的大小this指针 面向过程和面向对象的区别&#xff1a; C语言是面向过程的&#xff0c;关注的是过程&#xff0c;分析出求解问题的步骤&#xff0c;通过函数调用逐步解决…

第8关:定义一个名为PROC_AVGWEIGHT的有参数存储过程

USE mydata; #请在此处添加实现代码 ########## Begin ########## DELIMITER $ CREATE PROCEDURE PROC_AVGWEIGHT(IN SNO VARCHAR(10), IN JNO VARCHAR(10), OUT AVG_WEIGHT INT) BEGINSELECT ROUND(SUM(P.WEIGHT * SPJ.QTY) / SUM(SPJ.QTY)) INTO AVG_WEIGHTFROM PJOIN SPJ ON…

16.字符串处理函数——字符串长度函数

文章目录 前言一、题目描述 二、解题 程序运行代码 总结 前言 本系列为字符串处理函数编程题&#xff0c;点滴成长&#xff0c;一起逆袭。 一、题目描述 二、解题 程序运行代码 #include<stdio.h> #include<string.h> int main() {char str[ ]"0123\0456…

rank的相关loss

1、相关loss 1.1、loss相关简介 排序优化时&#xff0c;主要从三个角度来考虑构建loss&#xff0c;分别为pointwise、pairwise、listwise。pointwise将排序所有query当成一个整体&#xff0c;计算每个<query,doc>对的loss,相当于一个二分问题。pairwise以每个query为维…

Sailfish OS 移动操作系统

Jolla 是一家曾经致力于开发智能手机和平板电脑的公司&#xff0c;但是这些产品并没有取得成功。后来 Jolla 将重心转向了基于 Linux 的 Sailfish OS&#xff08;旗鱼&#xff09;&#xff0c;并将其应用于现有设备上。Sailfish OS 是由 Jolla 在 MeeGo 基础上开发的移动操作系…

开源播放器GSYVideoPlayer + ViewPager2 源码解析

开源播放器GSYVideoPlayer ViewPager2 源码解析 前言一、GSYVideoPlayer&#x1f525;&#x1f525;&#x1f525;是什么&#xff1f;二、源码解析1.ViewPager2Activity 总结 前言 本文介绍GSYVideoPlayer源码中关于ViewPager2 GSYVideoPlayer 实现的滑动播放列表的实现原理。…

【PTA题目】7-18 6翻了 分数 15

7-18 6翻了 分数 15 全屏浏览题目 切换布局 作者 陈越 单位 浙江大学 “666”是一种网络用语&#xff0c;大概是表示某人很厉害、我们很佩服的意思。最近又衍生出另一个数字“9”&#xff0c;意思是“6翻了”&#xff0c;实在太厉害的意思。如果你以为这就是厉害的最高境界&…

合成相机模型【图形学】

相机在计算机图形学中有两个方面的考虑&#xff1a;相机的位置和相机的形状。 要了解后者&#xff0c;我们需要了解相机的工作原理。 NSDT工具推荐&#xff1a; Three.js AI纹理开发包 - YOLO合成数据生成器 - GLTF/GLB在线编辑 - 3D模型格式在线转换 - 可编程3D场景编辑器 - R…

聊聊测试for Jeffky

什么是测试 测试是一个系统性的过程&#xff0c;它涉及到在已开发的软件中执行程序、应用工具和技术来评估其质量、功能和性能。这个过程的目的是发现并纠正程序中的错误&#xff0c;提高软件的可靠性和稳定性&#xff0c;以满足用户的需求。 测试的分类 什么是自动化测试 自动…

MySQL 教程 1.5

MySQL 创建数据表 创建 MySQL 数据表需要以下信息&#xff1a; 表名表字段名定义每个表字段的数据类型 语法 以下为创建 MySQL 数据表的 SQL 通用语法&#xff1a; CREATE TABLE table_name (column1 datatype,column2 datatype,... ); table_name 是你要创建的表的名称。…

多表查询与子查询

问题的引出&#xff1a; 这里有一个留言板&#xff0c;其中一条评论包含了商品名称good&#xff08;商品表&#xff09;&#xff0c;留言content(留言表)。 那么请问如将这个评论从数据库查询出来&#xff1f;这就涉及到了多表查询。 多表查询是指基于两个和两个以上的表查询.…

idea通过remote远程调试云服务器

引用了第三方的包&#xff0c;调试是看不到运行流程&#xff0c;于是想到了idea的remote方法 -agentlib:jdwptransportdt_socket,servery,suspendn,address9002 写一个.sh文件并启动 nohup java -jar -agentlib:jdwptransportdt_socket,servery,suspendn,address9002 ./demo.j…

论文解读--Robust lane detection and tracking with Ransac and Kalman filter

使用随机采样一致性和卡尔曼滤波的鲁棒的车道线跟踪 摘要 在之前的一篇论文中&#xff0c;我们描述了一种使用霍夫变换和迭代匹配滤波器的简单的车道检测方法[1]。本文扩展了这项工作&#xff0c;通过结合逆透视映射来创建道路的鸟瞰视图&#xff0c;应用随机样本共识来帮助消…

基于算能的国产AI边缘计算盒子8核心A53丨17.6Tops算力

边缘计算盒子 8核心A53丨17.6Tops算力 ● 可提供17.6TOPS&#xff08;INT8&#xff09;的峰值计算能力、2.2TFLOPS&#xff08;FP32&#xff09;的高精度算力&#xff0c;单芯片最高支持32路H.264 & H.265的实时解码能力。 ● 适配Caffe/TensorFlow/MxNet/PyTorch/ ONNX/…

倒计时 1 天,2023 IoTDB 用户大会期待与您相见!

终于&#xff01;就在明天&#xff0c;2023 IoTDB 用户大会即将在北京与大家见面&#xff01; 这场筹备已久的盛会&#xff0c;汇集了超 20 位大咖嘉宾带来的精彩议题&#xff0c;届时来自美国国家工程院、清华大学软件学院的产业大拿&#xff0c;与能源电力、钢铁冶炼、城轨运…

康托展开(Cantor Expansion)

【康托展开简介】康托展开&#xff08;Cantor Expansion&#xff09;是一种特殊的哈希函数&#xff0c;是一个相对快速的判重方法&#xff0c;其时间复杂度为O(n^2)&#xff0c;其中 n 是集合中元素的个数。康托展开能够判重&#xff0c;依据的是一个集合各元素产生的全部排列中…