mysql进阶-索引基础

目录

1. 概念-索引是什么?

2. 索引的数据结构(索引模型)

2.1 二分查找:

2.2 二叉查找树(BST Binary Search Tree):

2.3 平衡二叉树(AVL Tree Balanced binary search trees)

2.4 多路平衡查找树(B Tree Balanced Tree)

2.5 加强版多路平衡查找树(B+ Tree)

3. innodb如何存储索引和数据的?

3.1 索引分类

3.2 索引如何存储数据

4. 注意事项


1. 概念-索引是什么?

索引相当于一本书籍的目录,它是帮助数据库快速检索数据的一种数据结构。

维基百科的定义

数据库索引,是数据库管理系统中一个排序的数据结构,以协助快速查询、更新数据库表中的数据。

索引的简单示例图:

索引的好处就是查询更快。比较如下:

没有索引:查询数据时只能从磁盘中按顺序读取数据,直到找到所需要的数据。

有索引:从索引中找到数据存储的位置,然后直接从磁盘位置读取数据。

2. 索引的数据结构(索引模型)

索引的数据结构是B+Tree树。

比较一下相关的数据结构的优缺点:

2.1 二分查找:

优点:针对于有序数组,等值查询和比较查询的效率非常高。

缺点:更新数据可能需要挪动大量的数据。

适用场景:静态存储的数据。

2.2 二叉查找树(BST Binary Search Tree):

示例图:

特点:左子树所有的节点都小于父节点,右子树所有的节点都大于父节点。

优点:既能实现快速查找,又能够实现快速插入

缺点:查询耗时和这棵树的深度相关。假设我们的数据构成二叉查找树后,正好是一棵斜树,那么就和顺序查找的效率是一样的。

2.3 平衡二叉树(AVL Tree Balanced binary search trees)

定义:左右子树深度差绝对值不能超过1.

如何平衡:AVL树在插入和更新数据的时执行了1系列的计算和操作(左旋、右旋)来保证树的平衡。

存储特点:每个节点需要存储键值、数据磁盘地址、子节点引用

优点:解决了二叉查找树极端的斜树情况。

缺点:每个节点存储的数据太少,如果数据较多,树的深度依然很大。

2.4 多路平衡查找树(B Tree Balanced Tree)

示例图:

特点:分叉数永远比关键字数多1

如何平衡:分裂和合并

2.5 加强版多路平衡查找树(B+ Tree)

示例图:(图片来源于百度图片)

特点:1.关键字数和路数相等 2. B+Tree的根节点和枝节点中都不存储数据,只有叶子节点才存储数据。

优势:

        1. 扫库、扫表能力更强

         2. B+ Tree 的磁盘读写能力更强

        3.排序能力更强

        4. 效率更加稳定(B+Tree永远是在叶子节点拿到数据,所以IO次数是稳定的)。

3. innodb如何存储索引和数据的?

在innodb中索引即数据。

3.1 索引分类

聚集索引:索引键值的逻辑顺序和表数据据行的物流存储顺序是一致的。

二级索引(辅助索引):如果表有主键,那么主键索引就是聚集索引,其他的索引统一叫二级索引。

3.2 索引如何存储数据

主键索引存储了所有的数据。

二级索引并不会把完整记录在叶子节点放一份,因为这会带来额外的存储空间和计算浪费。二级索引的叶子节点存的是这条记录对应的主键的值。如果需要拿除索引和主键之外的值,需要再到主键索引的叶子节点拿到数据(这就是回表的概念)。

示例图:(图片来源于百度图片)

4. 注意事项

1.不要在频繁更新的列上建索引,因为会引起分裂和合并

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

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

相关文章

SG-8101CGA 系列 (晶体振荡器 可编程 可用 +125°C )

SG-8101CGA是可编程晶体振荡器,具有CMOS输出,适用于汽车,同时,该系列还提供相同的频率和其他参数的轻松编程能力,符合AEC-Q100标准,具有出色的电磁兼容性和稳定性,可以在各种环境下使用。外部尺…

第六站:C++面向对象

面向对象的第一概念:类 类的构成: “类”,是一种特殊的“数据类型”,不是一个具体的数据。 类的设计: 创建一个类: class Human { public://公有的,对外的void eat();//方法,成员函数void sleep();void play();void work();string getName();//获取对内…

【GitHub项目推荐--克隆你的声音】【转载】

今天推荐一个黑科技开源项目,只需要你 5 秒钟的声音对话,就能克隆出你的声音,而且能够实时的生成你任意语音。 是不是很顶? 我举个例子,如果我这里有 300 条你说话的语音,我把你的语音数据用这个开源项目…

c++ 开发生态环境、工作流程、生命周期-拾遗

拾遗 1 生态环境初识 当您使用Visual Studio 2019进行C开发时,您将进入C生态环境。以下是一些重要的概念和步骤: C程序的结构: 一个典型的C程序包括源文件(.cpp)、头文件(.h)、编译后的目标文…

Java 并发性和多线程3

七、线程安全及不可变性 当多个线程同时访问同一个资源,并且其中的一个或者多个线程对这个资源进行了写操作,才会产生竞态条件。多个线程同时读同一个资源不会产生竞态条件。 我们可以通过创建不可变的共享对象来保证对象在线程间共享时不会被修改&…

实战之-Redis代替session实现用户登录

一、设计key的结构 首先我们要思考一下利用redis来存储数据,那么到底使用哪种结构呢?由于存入的数据比较简单,我们可以考虑使用String,或者是使用哈希,如下图,如果使用String,注意他的value&…

AI老照片修复-Bringing-Old-Photos-Back-to-Life

🏡 个人主页:IT贫道-CSDN博客 🚩 私聊博主:私聊博主加WX好友,获取更多资料哦~ 🔔 博主个人B栈地址:豹哥教你学编程的个人空间-豹哥教你学编程个人主页-哔哩哔哩视频 目录 1. AI老照片修复原理-…

第18课 移植FFmpeg和openCV到Android环境

要在Android下从事音视频开发,同样也绕不开ffmpegopencv,不管是初学者还是有一定经验的程序,面临的首要问题就是环境的搭建和库文件的编译配置等问题,特别是初学者,往往会在实际开发前浪费大量的时间来编译ffmpeg及ope…

nvm管理多版本Node.js

nvm管理多版本Node.js 可能大家都曾苦恼于Node环境问题,某个项目需要升版本,某项目又需要降,甚至还出现npm版本与Node对不上的情况。 通过nvm进行版本管理,即可解决。 卸载Node 通过命令行输入node -v命令查看是否已安装Node&…

认知觉醒(九)

认知觉醒(九) 专注力——情绪和智慧的交叉地带 第一节 情绪专注:一招提振你的注意力 用元认知来观察自己的注意力是一件很有意思的事情,相信你可以轻易观察到这种现象:身体做着A,脑子却想着B。 跑步的时候,手脚在…

10.9.2 std::function 存储函数对象 Page184

41行,pending只是inc的复制品,所以43,44行,不会改变inc()的值 demo_function2()的运行结果: 59行,pending是inc的引用,所以61,62行将会改变inc()的值

Baumer工业相机堡盟工业相机如何通过NEOAPI SDK实现相机的高速图像保存(C++)

Baumer工业相机堡盟工业相机如何通过NEOAPI SDK实现相机的高速图像保存(C)) Baumer工业相机Baumer工业相机的图像高速保存的技术背景Baumer工业相机通过NEOAPI SDK函数图像高速保存在NEOAPI SDK里实现线程高速图像保存:工业相机高…

Vue-13、Vue绑定css样式

1、绑定css样式字符串写法&#xff0c;适用于&#xff1a;样式的类名不确定 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>绑定css样式</title><!--引入vue--><script type"tex…

2024三掌柜赠书活动第三期:Rust系统编程

目录 前言 Rust语言概念 关于《Rust系统编程》 Rust系统编程的核心点 Rust系统编程的关键技术和工具 编辑推荐 内容简介 作者简介 图书目录 书中前言/序言 《Rust系统编程》全书速览 结束语 前言 在技术圈&#xff0c;最近的编程语言新秀当属Rust莫属&#xff0c;R…

Java Swing 图书借阅系统 窗体项目 期末课程设计 窗体设计

视频教程&#xff1a; 【课程设计】图书借阅系统 功能描述&#xff1a; 图书管理系统有三个角色&#xff0c;系统管理员、图书管理员、借阅者&#xff1b; 系统管理员可以添加借阅用户&#xff1b; ​图书管理员可以添加图书&#xff0c;操作图书借阅和归还&#xff1b; 借…

希尔排序和计数排序

&#x1f4d1;前言 本文主要是【排序】——希尔排序、计数排序的文章&#xff0c;如果有什么需要改进的地方还请大佬指出⛺️ &#x1f3ac;作者简介&#xff1a;大家好&#xff0c;我是听风与他&#x1f947; ☁️博客首页&#xff1a;CSDN主页听风与他 &#x1f304;每日一句…

ElasticSearch(1):Elastic Stack简介

1 简介 ELK是一个免费开源的日志分析架构技术栈总称&#xff0c;官网https://www.elastic.co/cn。包含三大基础组件&#xff0c;分别是Elasticsearch、Logstash、Kibana。但实际上ELK不仅仅适用于日志分析&#xff0c;它还可以支持其它任何数据搜索、分析和收集的场景&#xf…

linux创建文件夹命令

我们可以使用mkdir命令在 Linux 或类似 Unix 的操作系统中创建新目录或文件夹。本文将介绍如何在 Linux 或 Unix 系统中创建文件夹&#xff08;也称为“目录”&#xff09;。 操作步骤如下&#xff1a;1.在 Linux 中打开终端应用程序。2.输入mkdir命令。3.输入文件夹名称。 m…

Unity与Android交互通信系列(4)

上篇文章我们实现了模块化调用&#xff0c;运用了模块化设计思想和简化了调用流程&#xff0c;本篇文章讲述UnityPlayerActivity类的继承和使用。 在一些深度交互场合&#xff0c;比如Activity切换、程序启动预处理等&#xff0c;这时可能会需要继承Application和UnityPlayerAc…