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子句中的字段不该创建索引

相关推荐
NineData2 小时前
NineData 迁移评估功能正式上线
数据库·dba
NineData7 小时前
数据库迁移总踩坑?用 NineData 迁移评估,提前识别所有兼容性风险
数据库·程序员·云计算
赵渝强老师9 小时前
【赵渝强老师】PostgreSQL中表的碎片
数据库·postgresql
全栈老石14 小时前
拆解低代码引擎核心:元数据驱动的"万能表"架构
数据库·低代码
倔强的石头_1 天前
kingbase备份与恢复实战(二)—— sys_dump库级逻辑备份与恢复(Windows详细步骤)
数据库
jiayou643 天前
KingbaseES 实战:深度解析数据库对象访问权限管理
数据库
于眠牧北3 天前
MySQL的锁类型,表锁,行锁,MVCC中所使用的临键锁
mysql
李广坤3 天前
MySQL 大表字段变更实践(改名 + 改类型 + 改长度)
数据库
Turnip12024 天前
深度解析:为什么简单的数据库"写操作"会在 MySQL 中卡住?
后端·mysql
爱可生开源社区4 天前
2026 年,优秀的 DBA 需要具备哪些素质?
数据库·人工智能·dba