MySQL索引篇

index

  • 存储引擎
  • 索引
    • InnoDB中的索引
    • MyISAM索引

存储引擎

以前一直认为关系型数据库中的索引不重要,知道最近学了MySQL高级篇,才发现,对MySQL一知半解。都是听人泛泛而谈。

首先MySQL服务器是怎么存数据的,怎么取到的,内存怎么跟磁盘交付的?

可以确定的是,MySQL5.7以后默认使用了InnoDB作为存储引擎。
、
使用存储引擎来拿到硬盘上的数据,然后放到内存,内存再跟缓冲池交互。

缓冲池是主内存中的一部分空间,用来缓存已使用的表和索引数据。缓冲池使得经常被使用的数据能够直接在内存中获得,从而提高速度。

我们用程序做的持久化操作,都是先把数据放到缓冲池,然后经过一定时间,数据会进行刷盘操作,然后持久化到硬盘上。

那么表的中的数据和索引又是怎么回事呢?
在MySQL8.0中,表的在硬盘的表示形式是.ibd文件存储。这个文件即存储了索引,又保存了数据。

索引

上面所里索引,这个玩意到底是什么。
索引是一种数据结构,是树,是数据。


InnoDB中的索引

  • InnoDB

    • InnoDB中的索引使用了B+树作为数据结构保存。
    • 每个表都有聚簇索引,如果有主键,主键默认是聚簇索引;如果没有主键,unique声明的列就是聚簇索引;每个没pk,uk,那么MySQL会默认指定一个索引,这个索引是隐藏的。
    • 聚簇索引,保存了主键,也保存了数据。以主键作为检索条件。
    • 非聚簇索引,保存了索引的列,还保存了列对应的主键索引值,以列的值作为检索条件。查这种索引时,会找到这个列,然后找到主键。根据主键查聚簇索引,再拿到完整数据。这种就称为回表
    • 除此之外,还有联合索引,即多个列构成的索引。
  • 索引的基本结构,怎么演变来的
    真是站在巨人的肩膀呀,别说我树还没玩明白。🤣

创建下面的表,有三个列,指明了行格式。

mysql> CREATE TABLE index_demo(
-> c1 INT,
-> c2 INT,
-> c3 CHAR(1),
-> PRIMARY KEY(c1)
-> ) ROW_FORMAT = Compact;

假定下图是index_demo表某一行数据的结构。
c1, c2, c3是列,里面存放了数据。

record_type :记录头信息的一项属性,表示记录的类型, 0 表示普通记录、 2 表示最小记录、 3 表示最大记录、 1是非叶子节点。

next_record :记录头信息的一项属性,表示下一条地址相对于本条记录的地址偏移量,我们用箭头来表明下一条记录是谁。

各个列的值 :这里只记录在 index_demo 表中的三个列,分别是 c1 、 c2 和 c3 。

其他信息 :除了上述3种信息以外的所有信息,包括其他隐藏列的值以及记录的> 额外信息。

补充:
数据存储的最小基本单位是,每一页里面存储了许多行,就像上面的结构一样,逻辑上多条数据是在一个页中的。

多个页构成了,表示连续的页,方便查找。

多个区构成了,表示数据区和页目录区。

还有一个零散区,可以放数据。
哥几个都属于表空间的。

这个是一页数据。

1. 包含最小记录,最大记录值
2. 普通记录值,列。
3. 最小记录指向主键,最小的主键从小往大排,执行最大记录值。
4. 这个页相当于一个叶子节点,然后也保存了数据
5. 多条数据构成了单向链表。

既然是B+树,不止一个叶子节点的,也不知3条数据的。这时页分裂了,我愿称之为细胞分裂


所有的主键是按从小到大排列的!橙色的背景。

多页数据来了,这个是双向链表,由页头里面的信息确认的。每个页不是连续的,所以页码是乱的,但是逻辑上是双向链表。

这时候,我知道了页面,也知道了每页的最小主键值,抽取页目录。

页目录就是看到的索引。使用二分法,可以快速找到数据。

比如,我查找主键是10的数据
1. 使用二分法定位10在5-12之间
2. 目录项3中的主键比10大
3. 找到目录2,循环列表得到10.

最终结构,将页目录抽取。

这就是B+树。

MyISAM索引

数据和索引是分开存储的,底层也是B+树,叶子节点存储的是磁盘上的地址。
MyISAM引擎都是非聚簇索引。

MyISAM的索引方式都是“非聚簇”的,与InnoDB包含1个聚簇索引是不同的。小结两种引擎中索引的区别:
① 在InnoDB存储引擎中,我们只需要根据主键值对 聚簇索引 进行一次查找就能找到对应的记录,而在
MyISAM 中却需要进行一次 回表 操作,意味着MyISAM中建立的索引相当于全部都是 二级索引 。
② InnoDB的数据文件本身就是索引文件,而MyISAM索引文件和数据文件是 分离的 ,索引文件仅保存数
据记录的地址。
③ InnoDB的非聚簇索引data域存储相应记录 主键的值 ,而MyISAM索引记录的是 地址 。换句话说,
InnoDB的所有非聚簇索引都引用主键作为data域。
④ MyISAM的回表操作是十分 快速 的,因为是拿着地址偏移量直接到文件中取数据的,反观InnoDB是通
过获取主键之后再去聚簇索引里找记录,虽然说也不慢,但还是比不上直接用地址去访问。
⑤ InnoDB要求表 必须有主键 ( MyISAM可以没有 )。如果没有显式指定,则MySQL系统会自动选择一个
可以非空且唯一标识数据记录的列作为主键。如果不存在这种列,则MySQL自动为InnoDB表生成一个隐
含字段作为主键,这个字段长度为6个字节,类型为长整型。

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

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

相关文章

sublime加入input函数_【挑战自学Python编程】第八天:while循环以及input()函数

摘要01 while循环02 input函数03 终端04 使用while循环与input()函数01 while循环在正式讲Python中的while前,希望大家先关注单词一下while,翻译为中文意思是:当。(这里我们只需要这一种意思即可)下面我们开始看while循…

文件循环读取_一个案例轻松认识Python文件处理提取文件中的数字

1、文件打开使用 open() 函数打开文件。它需要两个参数,第一个参数是文件路径或文件名,第二个是文件的打开模式。模式通常是下面这样的:"r",以只读模式打开,你只能读取文件但不能编辑/删除文件的任何内容&qu…

前端学习(1344):用户的增删改查操作1

const http require(http); const mongoose require(mongoose);//数据库连接 mongoose.connect(mongodb://localhost/playground, { useUnifiedTopology: true }).then(() > console.log(数据库连接成功)).catch(() > console.log(数据库连接失败));const userSchema …

索引常用注意事项

索引1. 索引怎么建好?2. 索引容易失效的场景3. 连接查询索引优化4. order by,group by5. 覆盖索引6. 索引下推1. 索引怎么建好? 单表 主键必须唯一,且单调递增有唯一键的,尽量建立唯一键where条件用得比较多的字段查询…

毫米波雷达_最新的7个毫米波雷达应用案例

毫米波雷达传感器如何做到"全天候"?毫米波雷达使用的技术是毫米波(millimeterwave),通常缩写为MMW,波长为1~10毫米,频率为30~300GHz的电磁波。根据波的传播理论,频率越高,波长越短&am…

前端学习(1345):用户的增删改查操作2

//创建http连接 const http require(http); //创建服务器 const app http.createServer(); //第三方模块导入 const mongoose require(mongoose); //获取连接 const url require(url); //数据库连接地址 mongoose.connect(mongodb://localhost/playground, { useUnifiedTop…

太阳光是平行光吗_“彩虹的形成是因为光的色散和光沿直线传播是一回事吗?”...

-1感谢某不愿透露姓名的高中同学提供支持。0请先解释一下你的这个问题提法可能的歧义:究竟是“是因为”后面的词语组成一个整体,还是“和”前面的词语组成一个整体呢?不讲清楚的话,答案会有一些差距。1“彩虹的形成是因为光的色散…

前端学习(1346):用户的增删改查操作3增加

//创建http连接 const http require(http); //创建服务器 const app http.createServer(); //第三方模块导入 const mongoose require(mongoose); //获取连接 const url require(url); // const querystring require(querystring); //数据库连接地址 mongoose.connect(mon…

闪电shader_【Shader案例】怎样做出自然的闪电

(本次案例的效果)最近下载了一套特效,其中一个关于闪电制作的shader想法特别聪明,这里特地附上原代码,并教你怎么把源代码转换成连连看,下面开始正文。这是原本shader定义的属性:_TintColor(闪电的颜色)_MainTex(一张R…

MySQL8数据恢复

binlog数据恢复恢复流程恢复流程 先登录MySQL flush log flush log这样会在MySQL binglog日志目录重新生成二进制文件 查看日志文件名 binlog.000033是我刚生成的日志,现在操作的是binlog.000032这个文件。相当于备份了下。 基于位置恢复(先查看位置…

前端学习(1347):用户的增删改查操作4修改

//创建http连接 const http require(http); //创建服务器 const app http.createServer(); //第三方模块导入 const mongoose require(mongoose); //获取连接 const url require(url); // const querystring require(querystring); //数据库连接地址 mongoose.connect(mon…

前端学习(1348):用户的增删改查操作5修改

//创建http连接 const http require(http); //创建服务器 const app http.createServer(); //第三方模块导入 const mongoose require(mongoose); //获取连接 const url require(url); // const querystring require(querystring); //数据库连接地址 mongoose.connect(mon…

parallelStream与stream

并行流🍭 多线程并发🍭 多线程并发 🍕stream与parallelStream 下面的代码分别用了parallelStream与stream进行迭代。获取对应的每一项值,和对应的线程名称。 package top.lel.jvm.sdk.stream;import java.util.List; import jav…

前端学习(1349):用户的增删改查操作6删除

//创建http连接 const http require(http); //创建服务器 const app http.createServer(); //第三方模块导入 const mongoose require(mongoose); //获取连接 const url require(url); // const querystring require(querystring); //数据库连接地址 mongoose.connect(mon…

0网卡开启_中标麒麟Linux v7系统下设置双网卡bond或team绑定详细过程

中标麒麟Linux v7系统下设置双网卡bond或team绑定详细过程。所谓bond,就是把多个物理网卡绑定成一个逻辑网卡,使用同一个IP工作,在增加带宽的同时也可以提高冗余性,一般使用较多的就是来提高冗余,分别和不同交换机相连…

前端学习(1350):用户的增删改查操作7增删改查

demo25.js //创建http连接 const http require(http); //创建服务器 const app http.createServer(); //第三方模块导入 /* const mongoose require(mongoose); */ //获取连接 const url require(url); // const querystring require(querystring);require(./demo26.js);…

基于aop的日志记录

aop实现日志记录记录工具切面logback配置测试记录工具 目标: 统计rest接口请求参数,请求地址,请求IP,响应数据,响应时间。方便后续问题排查,以及性能的总体分析。 基于springboot会使用面向切面编程基于l…

前端学习(1351)模板引擎

const template require(art-template); //绝对路径 模板中显示的数据 const path require(path); const views path.join(__dirname, index.art); const html template(views, {name: 张三,age: 20 }); console.log(html); index.art <!DOCTYPE html> <html la…

前端学习(1352)模板语法

demo27.js const template require(art-template); //绝对路径 模板中显示的数据 const path require(path); const views path.join(__dirname, 01.art); const html template(views, {name: 张三,age: 20,content: <h1>我是歌谣</h1> }); console.log(html)…