MySQL中的索引事务(1)索引----》数据库运行的原理知识+面试题~

2023-11-12

本篇文章主要讲述MySQL索引事务

所谓的索引index就是指:目录~~

索引存在的意义:加快查找的速度(省略了遍历的过程),但付出了一定的代价~

付出的代价如下:

1.需要付出额外的空间代价来保存索引数据

2.索引可能会拖慢新增,删除,修改数据的速度

但是,在总体来说,还是认为索引的利大于弊~~

在实际开发中,查询场景一般要比增删改频率高很多

查看索引:

show index from 表名;

创建索引:

create index 索引名 on 表名(列名);

索引名称可任意取

比如:把表中的内容,根据name搞了一份目录(索引)出来~

create index index_student_name on student(name);

创建索引的操作,可能很危险,如果表里的数据很大,这个建立索引的开销也会很大……,其实最好的做法就是:创表之初就把索引设定好了,如果表里已经有很多数据了,那么,索引就别动了~

删除索引:

drop index 索引名 on 表名;

删除索引和创建索引类似,删除索引也是有风险的~~

索引可以加快查询的速度,其实在索引背后的数据结构(查询)是B+树(为数据库索引量身定做的数据结构)~~B+树我们不做特别要求,但是对于B+树的特点与优势咋说咱也得知道点不??

B+树特点:

  1. 一个节点,可以存储N个key,N个key划分出了N个区间(而不是N+1个区间)
  2. 每个节点中的key的值都会在子节点中存在(同时该key是子节点的最大值)
  3. B+树的叶子节点,是首尾相连,类似于链表
  4. 由于叶子节点是完整的数据集合,只在叶子节点这里存储数据表的每一行数据,而非叶子节点,只保存key值本身即可

整个树的所有节点,都包含在叶子节点中(所有非叶子节点中的key最终都会出现在叶子节点中~~)
 

IO:input  output------>输入输出

显示数据到显示器上,从键盘输入数据

把数据写到硬盘上,从硬盘上读数据

把数据写到网卡里,从网卡读数据。

B+ 树的优势:

  1. 当前一个节点保存更多的key,最终树的高度是相对更矮,查询时候减少了IO访问次数(和B树是一样的)(IO是指输入输出)
  2. 所有的查询最终都会落到叶子节点上(查询任何一个数据,经过的IO访问次数是一样的)
  3. B+树的所有叶子节点,构成链表,此时比较方便进行范围查询。
  4. 由于数据都是在叶子节点上,非叶子节点只存储key,导致非叶子节点,所占的空间是比较小的,这些非叶子节点就可以在内存中缓存(或者缓存一部分),又进一步减少了IO的次数。

在MySQL中组织数据的方式:

当年看到一张“表”的时候,实际上这个表不一定是按照“表格”这样的数据结构在硬盘上组织的,也有可能是按照这种树(B+树)形式组织(具体是哪种结构,取决于你的表里有没有索引,一级数据库使用了哪种索引~)

在一个表中:如果id是表的主键,若表里有多个索引呢??(id,name两个索引)表的数据还是按照id为主键,构建出B+树,通过叶子节点组织所有的数据行……,其次,针对name这一列会创建另外一个B+树,但是这个B+树的叶子节点就不再存储这一行的完整数据,而是存储主键id!!!此时,如果你根据name来查询,查到叶子节点得到的只是主键id,还需要通过主键id去主键的B+树里面在查找一次(一共查找两次B+树)(上述的过程称为“回表”,这个过程是MySQL自动完成的,用户感知不到~)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

MySQL中的索引事务(1)索引----》数据库运行的原理知识+面试题~ 的相关文章

  • 如何在Sequelize中设置查询超时?

    我想看看如何在 Sequelize 中设置查询的超时时间 我查看了 Sequelize 文档以获取一些信息 但我找不到我要找的东西 我发现的最接近的是 pools acquire 选项 但我不想设置传入连接的超时 而是设置正在进行的查询的超
  • 独立对列进行排序,使得所有空值都位于每列的最后

    这是一个名为的示例表animal name color fox brown fox red dog gold 现在 我想要的是这样的结果 fox dog brown gold red 名称应该是结果的列 不同颜色值作为行 我的第一个想法是
  • sql server 按组排名

    问题看似简单 但我却无法理解 这是针对 sql 服务器的 what I have in a table What I need as a output cksum id cksum id 2162514679 204 2162514679
  • 如何从 PostgreSQL 中的时间戳列值提取一天中的时间(或小时)?

    我正在尝试从 PostgreSQL 中的 时间戳 列中提取一天中的时间 这是我的做法 但是 太糟糕了 知道如何做得更好吗 SELECT date part hour date demande text hours date part min
  • 当所有维度值都具有 100% 重要性时处理多对多维度

    我至少会尽力保持简洁 假设我们正在跟踪一段时间内的账户余额 所以我们的事实表将包含诸如 账户余额情况表 FK 账户ID FK 日期ID Balance 显然你有一个账户维度表 and a 日期维度表 所以现在我们可以轻松地过滤帐户或日期 或
  • Mysql 将 int 转换为 MAC

    我有一些数据可以转换 其中有 2 列 其中一列有 IP 它包含整数值 我在 mysql 查询中使用了以下函数 是否有一个函数可以用来转换我的 mac 列 其中包含整数和数据类型是bigint to MAC地址 SELECT INET NTO
  • 为什么 SqlClient 在传递 SqlXml 时使用不必要的 XML 转换?

    我有一个关于从 C 代码将 xml 数据类型传递给查询的问题 首先 这是 SQL Server 上的一个表 CREATE TABLE dbo XmlTable id int IDENTITY 1 1 NOT NULL dat xml NOT
  • 单独的逗号分隔值并存储在sql server的表中

    我有一个存储过程 它将逗号分隔的值作为输入 我需要将其分开并需要将其作为单独的行存储在表中 令 SP 的输入为 Rule ID ListType ID Values 1 2 319 400 521 8465 2013 我需要将它存储在一个名
  • 如何 md5 所有列(无论类型如何)

    我想创建一个 sql 查询 或 plpgsql 它将 md5 所有给定的行 无论类型如何 但是 在下面 如果 1 为空 则哈希为空 UPDATE thetable SET hash md5 accountid accounttype cre
  • SELECT 语句会受到 SQL 注入攻击吗?

    实际上有2个问题 我知道我必须尽可能多地使用存储过程 但我想知道以下内容 A 我可以从 SELECT 语句 例如 Select from MyTable 获得 SQL 注入攻击吗 B 另外 当我在 ASP NET 中使用 SQLDataSo
  • 如何使用 Perl 更改 mysql 密码

    我需要使用 Perl 脚本更改一些 mysql 密码 以下内容在更改数据库条目时有效 但是当我针对 mysql 用户更改修改它时 它将它们重置为空白密码 最后 刷新权限 也很好 但我还没有找到方法 usr bin perl use DBI
  • 为什么我可以像调用实例方法一样调用类方法?

    我正在查看这个例子 class SQLObject def self columns return columns if columns columns DBConnection execute2 lt lt SQL first SELEC
  • XML 解析:格式良好的检查:未声明的实体

    我正在使用 SSMS 2008 但收到以下错误 你知道这意味着什么吗 Msg 9448 Level 16 State 1 Line 4 XML parsing line 1 character 89 well formed check un
  • 如何使用sql作为xml路径('')但保留回车符

    我有下面的代码 select select cast Narrative as Varchar max char 13 from officeclientledger where ptmatter matter and ptTrans 4
  • 映射 mysql 中同一个表的多个值

    您好 我必须使用另一个表中的值 id 获取文本值 表 1 包含值 ID 表 2 包含名称和值 ID 表 1 SEVERITY OCCURENCE DETECTABILITY 2 3 4 表 2 id name value 1 Very Hi
  • Google BQ:运行参数化查询,其中参数变量是 BQ 表目标

    我正在尝试从 Linux 命令行为 BQ 表目标运行 SQL 此 SQL 脚本将用于多个日期 客户端和 BQ 表目标 因此这需要在我的 BQ API 命令行调用中使用参数 标志 parameter 现在 我已经点击此链接来了解参数化查询 h
  • 在 postgres 查询中使用列表

    我有一个动态列表 list a b c d 所以长度可能会改变 我想在查询中比较这些列表值 select from student where name in all the list values 我想将列表值传递到此查询中 我怎样才能做
  • 如何获得顶部带有千位分隔符的数字?

    SELECT count FROM table A 假设结果是8689 我怎样才能将它转换为8 689在 SQL Server 上 尝试这样 select replace convert varchar convert Money coun
  • SQL Server 上的语法错误

    这可能是一个愚蠢的语法错误 但我只是继续阅读我的程序 但我无法弄清楚我的错误在哪里 消息 156 第 15 级 状态 1 第 41 行关键字附近的语法不正确 为了 这是我的代码 alter procedure LockReservation
  • 在 Oracle 行的多个列上使用透视

    我在 Oracle 表中有以下示例数据 tab1 我正在尝试将行转换为列 我知道如何在某一列上使用 Oracle 数据透视表 但是否可以将其应用于多个列 样本数据 Type weight height A 50 10 A 60 12 B 4

随机推荐

  • 微信小程序 — 网络封装(基础篇一)

    网络请求类封装 const baseUrl https xxx xx xx export default function reqeust params return new Promise resolve reject gt wx req
  • vue项目实现锚点定位功能

    背景 在html中使用id可以简单实现锚点坐标功能 如下 起点 a href mark 起点 a 终点 div 终点 div 但是此时在url中会添加mark 不直接用以上方法的原因主要有二 1 它影响路径 如果做数据提交或其他需要获取当前
  • 讯飞语音转写

    逻辑 语音上传 gt prepare 讯飞 返回一个task id gt 音频分片上传 upload 讯飞 调用多次 直到文件全部上传完成 gt 合并音频merge 讯飞 gt 每三分钟调用getProgress 讯飞 gt 得到结果get
  • vue项目各种报错-2

    最近做了一个级联下拉框作为表单查询条件的项目 但是在点击查询按钮后报如下报错 但表单查询功能不受任何应影响 解决 当用户切换options数据时 就会重新渲染el cascader组件 给级联选择器绑定 key 值 通过 watcher 监
  • SpringBoot创建一个简单项目和用到的注解解释

    SpringBoot本身就是一个maven项目 IDEA中创建一个简单项目以后 在启动类对应的包下面 包的的子级也可以 这里用的是HelloController 代码如下 访问路径 localhost 8080 hello 项目启动 直接在
  • c语言大数相加

    大数相加 由于整型数的位数有限 因此整型数不能满足大整数 超长整数 的运算要求 大整数计算是利用字符串来表示大整数 即用字符串的一位字符表示大整数的一位数值 然后根据四则运算规则实现大整数的四则运算 大数相加我主要总结如下 1 定义两个字符
  • docker安装centos7系统并使用xshell连接

    文章目录 前言 一 docker和虚拟机 二 docker安装 1 引入库 2 docker安装centos7系统 3 修改docker为自动重启 4 修改docker某个容器自动重启 总结 前言 在搭建视频服务器时 遇到了需要集群的问题
  • 杰理之芯片丝印说明【篇】

    第一行 杰理公司LOGO 第二行 字母 代表芯片的生产信息 即 批次号 2C4 代表芯片型号的末3位 从芯片丝印 是 看不出 芯片的具体型号 例如 图片的丝印 对应的型号有可能是 AC6322C4 AC6352C4 AC6362C4 等
  • OpenWrt目录结构及编译过程

    OpenWrt代码有8个固定的顶层目录以及7个编译时创建的临时目录 顶层目录 docs docs目录 用于存放开发文档 编译时不需要 包含了整个宿主机的文件源码的介绍 里面还有Makefile为目标系统生成docs 使用make C doc
  • 〖Web全栈开发①〗—网络编程基础(上)

    网络编程基础 网络编程 网络编程概述 TCP IP协议 IP地址 什么是IP IP组成 IP 地址使用过程 查看IP Ip地址分类 子网掩码 端口 socket Socket原理 什么是Socket 2 创建一个tcp socket tcp
  • Redis基础语法

    noSQL 主要解决高并发数据 可以提高访问性能 将低服务器负担 Redis 底层结构 采用键值对存储 工作机制 采用单线程 Redis的数据结构 实用度左至右 string hash list set zset key value key
  • 新博客地址

    现在新的博客地址 https rpz105 com https rpz105 com
  • 【 unity3d 】天空盒的创建和使用

    天空盒 周围环境 天空 注意不是地形 一 创建天空盒材质 1 先创建材质 材质里的Shader里找Skybox 有3个制作方式 但是他们的渲染效果一样 只是制作方式不一样
  • LaTeX基本命令使用教程(清晰实例)(Overleaf平台)(论文排版)

    前言 本文是笔者在学习LaTeX的记录文档 主要是一些常用命令 发至博客分享给大家 笔者的感受是熟悉这些常用命令后即可上手编辑简单的论文 效率很高 体验比word好很多 希望本文能够对LaTeX的初学者有所帮助 有任何问题可以在评论区留言
  • 存储过程进行数据合并导入

    CREATE PROCEDURE sp mytest1 mytype int AS declare pro varchar 50 declare pro1 varchar 50 select pro typename from table1
  • web浏览器访问后端提示‘没有javascript支持,将不能正常工作’

    如图提示 网上找了一下解决办法 说是可能浏览器js支持没有开启 但我的浏览器js支持是开启的 后面清理了下浏览器的缓存 问题解决
  • 如何使用 Kubernetes 监测定位慢调用

    监控作者 李煌东 大家好 我是阿里云的李煌东 今天我为大家分享 Kubernetes 监测公开课第四节 如何使用 Kubernetes 监测定位慢调用 今天的课程主要分为三大部分 首先我会介绍一下慢调用的危害以及常见的原因 其次我会介绍慢调
  • Java&JS时间格式转化

    时间格式转化 一 Java格式转化 1 1 接收前端传值转化 1 2 String转化LocalDate 1 3 LocalDate与Date相互转换 二 Javascript格式转化 2 1 JS时间格式转化 一 Java格式转化 1 1
  • openswan中ISAKMP交互过程关键函数接口

    1 ISAKMP交互过程中关键函数接口 下面分别说明不同的阶段和模式下的函数接口以及对应的报文 2 第一阶段 Phase I 主模式函数接口 发送端 响应端 main outI1 主模式第一包
  • MySQL中的索引事务(1)索引----》数据库运行的原理知识+面试题~

    本篇文章主要讲述MySQL索引事务 所谓的索引index就是指 目录 索引存在的意义 加快查找的速度 省略了遍历的过程 但付出了一定的代价 付出的代价如下 1 需要付出额外的空间代价来保存索引数据 2 索引可能会拖慢新增 删除 修改数据的速