【MYSQL】索引的原理(B+树实现)和操作

news2024/11/22 18:38:14

目录

 1.MYSQL与磁盘交互的基本单位

2.索引的原理

3.聚簇索引

4.索引操作


认识磁盘 

 1.MYSQL与磁盘交互的基本单位

为了提高基本的IO效率, MySQL进行IO的基本单位是16KB

  • 一次使用16KB(称为page)为单位大于磁道的扇面(521B),那么储存MYSQL的数据就会把16KB的数据连续存储在多个扇面上,那么磁头巡道的次数减少(数据是连续存放的),效率得到了提高;

1.1.数据如何存储到磁盘的

  • MySQL服务器在内存中运行的时候,在服务器内部,就申请了被称为 Buffer Pool 的的大内存空间(通常:128MB),来进行各种缓存。

2.索引的原理

2.1.单个page数据节点

  • page使用双链表的结构来管理;
  • 单个page数据节点由两个指针和数据构成;

 

 2.2.如何提升单个page节点的查找速度--页目录

  • 给page加上一个目录就可以提高查找速度;
  • 每个目录保存主键值(采用最小的主键值保存)和一个指向数据的指针;
  • 每隔多个就做一个目录;

2.3.多个page添加页目录

  • 这个的数据结构叫做B+树;
  • 叶子节点使用双向列表连接起来的,因为数据会排序,可能插入一个节点这个page已满,需要到下一个节点;

 2.3.1.一个非叶子节点可以管理多少个节点;

Q:128MB有多少个page?

A:128*1024/16=8192;

Q:一个page可以管理多少节点?

A:16*1024/8=2048;

那么只需要5个非叶子节点(第一层1个,第二层4个)就可以管理号128MB;

2.4.为什么不用其他的数据结构来设计索引

1.红黑树:它的效率也不低,但是它的树的高度是高于B+树的,所以IO次数更多效率更低;

2.哈希表:哈希表查找单个数据的效率很好,但是如果是范围性查找,查10到100之间的数据,因为它并不会排序那么只能一个个的找,效率并不高;

索引需要树的高度低,来减少IO次数,并且要排序来支持范围性查找

3.聚簇索引

聚簇索引:innodb就是聚簇索引,和B+那个图一样数据在page内;

非聚簇索引:myisam就是非聚簇索引,就是page内是一个指向数据的指针

3.1.回表查询

如果innodb建立普通索引:需要查询2次,先在普通索引查找到主键,再使用主键在主键索引中查找数据;这样设置是为了防止数据冗余;

myisam就没有这个问题,myisam是非聚簇索引page保存的是指向数据的指针,所以myisam更适合做一些查找的情况;

4.索引操作

查询索引信息

格式:show index from 表名;

4.1.主键索引

创建主键索引

1.创建主键默认创建索引
create table t1 ( id int unsigned primary key auto_increment );
2.后续添加主键也可以
create table t2 ( id int  );
alter table t2 add primary key(id);

删除主键索引

alter table t1 drop primary key;

4.2.普通索引

创建普通索引

1.
create table t3 (id int primary key auto_increment, name char(5),index(name) );
2. 
create table t3 (id int primary key auto_increment, name char(5) );
alter table t3 add index(name);

 删除普通索引

alter table t3 drop index(name);

4.3.唯一键索引的操作和主键一样就是加unique和删除unique;

4.4.索引创建原则:

  1. 比较频繁作为查询条件的字段应该创建索引;
  2. 唯一性太差的字段不适合单独创建索引,即使频繁作为查询条件
  3. 更新非常频繁的字段不适合作创建索引;(插入效率低)
  4. 不会出现在where子句中的字段不该创建索引;(索引就是用来查询的,如果不在where出现根本就不会查询)

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

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

相关文章

Golang笔记:使用ssh包作为客户端与SSH服务器交互

文章目录 目的基础说明使用演示单次通讯连续通讯(远程终端) 总结 目的 Golang中可以使用 golang.org/x/crypto/ssh 包作为SSH客户端或者SSH服务使用。这篇文章将简单记录下作为客户端使用的一些内容。 Package ssh implements an SSH client and server…

Java基础 开发相关的介绍和准备(开发环境搭建)

Java 概述 是 SUN(Stanford University Network,斯坦福大学网络公司 ) 1995 年推出的一门高级 编程语言。 是一种面向 Internet 的编程语言。Java 一开始富有吸引力是因为 Java 程序可以在 Web 浏览器中运行。这些 Java 程序被称为 Java 小程序(applet)&#xff0c…

学系统集成项目管理工程师(中项)系列22a_信息化知识(上)

1. 战略资源 1.1. 信息 1.2. 土地 1.3. 能源 1.4. 材料 2. 信息information 2.1. 客观事物状态和运动特征的一种普遍形式 2.2. 控制论 2.2.1. 维纳Norbert Wiener 2.2.2. 信息就是信息,既不是物质也不是能量 2.3. 哲学界 2.3.1. 信息是事物普遍联系的方式…

通过xshell连接甲骨文服务器并安装宝塔详细图文教程避免踩坑

问题: 一,甲骨文创建好了,并且下载了私钥,怎么连接?忘记下载了怎么办? 二,xshell怎么使用? 三,宝塔怎么安装? 起点: 最近有幸注册了一个甲骨…

SpringBoot--Lombok--Initailizr--yaml

目录 SpringBoot--Lombok Lombok 介绍 ● Lombok 作用 ● SpringBoot 和IDEA 官方支持 Lombok 常用注解 Lombok 应用实例 代码实现 在pom.xml 引入lombok 修改Furn.java 使用Lombok 注解简化代码, 解读 NoArgsConstructor AllArgsConstructor ToString Setter Ge…

多种方法解决Please specify which branch you want to merge with的错误

文章目录 1. 复现错误2. 分析错误3. 解决错误3.1 远程有分支3.2 远程无分支 4. 总结 1. 复现错误 今天发布某版本的项目,准备创建个v0point1分支,后期如果修改该版本,直接在该分支上修改即可。 首先,使用git branch v0point1命令…

软考A计划-真题-分类精讲汇总-第十三章(专业英语)

点击跳转专栏>Unity3D特效百例点击跳转专栏>案例项目实战源码点击跳转专栏>游戏脚本-辅助自动化点击跳转专栏>Android控件全解手册点击跳转专栏>Scratch编程案例 👉关于作者 专注于Android/Unity和各种游戏开发技巧,以及各种资源分享&am…

红黑树的实现

文章目录 红黑树前言1. 红黑树的概念及性质1.1 红黑树的概念1.2 红黑树的性质 2. 红黑树的结构2.1 红黑树节点的定义2.2 红黑树的结构 3. 红黑树的操作3.1 红黑树的查找3.2 红黑树的插入处理红黑树颜色的过程(重点)情况1: 只变色情况2: 变色 单旋情况3: 变色 双旋 处理颜色的…

ubuntu深度学习使用TensorFlow卷积神经网络——图片数据集的制作以及制作好的数据集的使用

首先我事先准备好五分类的图片放在对应的文件夹,图片资源在我的gitee文件夹中链接如下:文件管理: 用于存各种数据https://gitee.com/xiaoxiaotai/file-management.git 里面有imgs目录和npy目录,imgs就是存放5分类的图片的目录,里面…

哈工大计组大作业-RISC处理器设计

RISC_CPU_HIT RISC处理器设计 地址:https://github.com/944613709/Design-of-RISC-Processor.git 要求 根据计算机组成原理课程所学的知识,设计一个给定指令系统的处理器,深刻理解处理器结构和计算机系统的整体工作原理。 1. 处理器功能及…

软件工程(二) 软件开发模型

软件开发模型主要了解如下这些模型,加粗表示重点要掌握的模型。 瀑布模型: 迭代模型/迭代开开发方法 演化模型: 快速开发应用 增量模型: 构建组装模型/基于构建的开发方法 螺旋模型: 统一过程/统一开发方法 原型模型: 敏捷开发方法 喷泉模型: 模型驱动的开发方法 V模型: 基于架…

C/C++每日一练(20230516) 最佳时机、两数相加、后序遍历

目录 1. 买卖股票的最佳时机 🌟 2. 两数相加 🌟🌟 3. 二叉树的后序遍历 🌟 🌟 每日一练刷题专栏 🌟 Golang每日一练 专栏 Python每日一练 专栏 C/C每日一练 专栏 Java每日一练 专栏 1. 买卖股票…

D2. Red-Blue Operations (Hard Version)(思维/贪心/前缀和)

建议先从easy version开始做。 easy version题解 题目 题意 给定长度为n(1<n<200000)的数组 1<a[i]<10^9 q个查询(1<q<200000)&#xff0c;每次查询&#xff0c;给定整数k(1<k<10^9) 初始时&#xff0c;每个元素状态都是红色。 对于第i次操作&…

【小沐学Unity3d】Unity插件之天气系统UniStorm

文章目录 1、简介1.1 描述1.2 兼容性1.3 价格1.4 特点1.5 示例 3、安装3.1 新建Unity项目3.2 安装插件UniStorm3.3 介绍UniStorm工具栏3.4 入门使用 4、脚本开发4.1 接口简介4.1.1 天气4.1.2 时间4.1.3 程度4.1.4 季节4.1.5 系统4.1.6 其他 4.2 接口测试4.2.1 测试1 结语 1、简…

教你如何使用Nodejs搭建HTTP web服务器并发布上线公网

文章目录 前言1.安装Node.js环境2.创建node.js服务3. 访问node.js 服务4.内网穿透4.1 安装配置cpolar内网穿透4.2 创建隧道映射本地端口 5.固定公网地址 转载自内网穿透工具的文章&#xff1a;使用Nodejs搭建HTTP服务&#xff0c;并实现公网远程访问「内网穿透」 前言 Node.js…

60岁的机器视觉工程师,你还在敲代码?不想做机器视觉工程师,还可以做什么?机器视觉工程师职业生命线有多长​?

如果按程序员参加工作时间为22岁计算,平均退役年龄为35岁计算的话,程序员的职业寿命大概为14年。为什么程序员的职业生命线如此短暂呢?大致有以下几点—— 1、编程技术层出不穷,迭代速度非常快,这时候就需要我们不断的学习,不断地保持学习能力,当随着年龄的增长我们的学…

【数据结构】链表:带头双向循环链表的增删查改

本篇要分享的内容是带头双向链表&#xff0c;以下为本片目录 目录 一、链表的所有结构 二、带头双向链表 2.1尾部插入 2.2哨兵位的初始化 2.3头部插入 2.4 打印链表 2.5尾部删除 2.6头部删除 2.7查找结点 2.8任意位置插入 2.9任意位置删除 在刚开始接触链表的时候&…

86. print输出函数知识拓展(有练习题)

86. print输出函数知识拓展&#xff08;有练习题&#xff09; 文章目录 86. print输出函数知识拓展&#xff08;有练习题&#xff09;1. print函数语法2. 横着输出数字序列3. 竖着输出数字序列4. 循环输出5. 总结 1. print函数语法 print[prɪnt]&#xff1a;打印&#xff0c;…

少儿编程scratch -- 基础篇

1.开篇 花费40分钟 首先&#xff0c;我们学的是scratch(划痕&#xff09;&#xff0c;Scratch 是麻省理工学院的“终身幼儿园团队”在 2007 年 [5] 发布的一种图形化编程工具&#xff0c;主要面对全球青少年开放&#xff0c;是图形化编程工具当中最广为人知的一种&…

ShardingSphere-JDBC整合SpringBoot JPA读写分离失败

问题 最近在整合ShardingSphere JDBC和Spring Boot的时候遇到一个问题,当ORM框架使用JPA时,读写分离会失效,查询仍然走主库并不会走从库!同样的配置使用Mybatis就没有任何问题。 在查阅各种资料后,初步确定未JPA事务问题 ShardingSphere负载均衡算法 我当前使用的版本是…