MySQL之索引

认识磁盘

磁盘的基本单位是512B

OS与磁盘交互的基本单位是4K。

MySQL与磁盘交互的基本单位

16384 = 1024 * 16;及MySQL与磁盘交互的基本单位是16KB。这个基本单位在MySQL这里称为page。

MySQL运行的基本逻辑

启动MySQL服务会在内存中开辟一个大的内存块(buffer pool),存放OS加载进来的数据。

在特定的时间内,数据一定是磁盘和内存中都有的。后续操作完内存数据之后,以特定的刷新策略,刷新到磁盘中。而此时,就涉及到了磁盘和内存的数据交互了,也就是IO。而MySQL与内存交互的基本单位就是Page

在buffer pool中存放着从OS加载进来的数据,其管理的基本单位就是Page。每个Page中的数据以链表的形式关联,Page和Page之间也是以链表形式关联的。

链表的优势在于增和删快,但是查询的效率是O(N),并不快。

MySQL为了提高查询效率的措施如下:

1、在单个Page中增添了目录结构,Page页中的数据会自动按主键(唯一、非空、不重复)排序,其目的就是服务目录结构的。每个单个Page页称为普通页,普通页中存放着数据

2、在Page和Page之间页添加了目录结构,称为目录页,目录页中并不存放数据,只用于保存每个Page页中最小的主键值和其地址的映射。

如果有多个目录页也可以按照目录页的策略继续向上构建上一层的目录页,最终能形成单位的目录页。

这样的结构就是B+树结构。

为什么会选择B+树结构?

聚簇索引和非聚簇索引

聚簇索引:MyISAM 引擎同样使用B+树作为索引结果,叶节点的data域存放的是数据记录的地址。其中, MyISAM 最大的特点是,将索引Page和数据Page分离,也就是叶子节点没有数据,只有对应数据的地址。

非聚簇索引:相较于InonoDB索引,InonoDB是将索引和数据放在一起的。

普通索引

InnoDB的非主键索引中叶子节点中并没有数据,而只有对应记录的key值。所以通过辅助(普通)索引,找到目标索引,需要两遍索引。首先检索辅助索引获得主键,然后用主键到主键索引中检索获得数据。这样的过程称为回表查询

创建主键索引

主键索引特点

一个表中,最多有一个主键索引,当然可以使复合主键

主键索引的效率高(主键不可重复)

创建主键索引的列,它的值不能为null,且不能重复

主键索引的列基本上是int

创建普通索引

普通索引特点

一个表中可以有多个普通索引,普通索引在实际开发中用的比较多

如果某列需要创建索引,但是该列有重复的值,那么我们就应该使用普通索引

查询索引

删除索引

索引创建原则

比较频繁作为查询条件的字段应该创建索引

唯一性太差的字段不适合单独创建索引,即使频繁作为查询条件

更新非常频繁的字段不适合作创建索引

不会出现在where子句中的字段不该创建索引

相关推荐
不羁。。5 小时前
【撸靶笔记】第八关:GET - Blind - Boolian Based - Single Quotes
数据库·sql·mybatis
AwhiteV6 小时前
利用图数据库高效解决 Text2sql 任务中表结构复杂时占用过多大模型上下文的问题
数据库·人工智能·自然语言处理·oracle·大模型·text2sql
m0_595199856 小时前
Redis(以Django为例,含具体操作步骤)
数据库·redis·缓存
爱尚你19937 小时前
MySQL 三大日志:redo log、undo log、binlog 详解
数据库·mysql
小猿姐8 小时前
KubeBlocks AI:AI时代的云原生数据库运维探索
数据库·人工智能·云原生·kubeblocks
NocoBase9 小时前
10 个开源工具,快速构建数据应用
数据库·低代码·开源
麻辣清汤10 小时前
结合BI多维度异常分析(日期-> 商家/渠道->日期(商家/渠道))
数据库·python·sql·finebi
钢铁男儿10 小时前
Python 正则表达式(正则表达式和Python 语言)
python·mysql·正则表达式
Kan先生11 小时前
对象存储解决方案:MinIO 的架构与代码实战
数据库·python
超级迅猛龙12 小时前
保姆级Debezium抽取SQL Server同步kafka
数据库·hadoop·mysql·sqlserver·kafka·linq·cdc