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

相关推荐
U-52184F691 分钟前
深入理解“隐式共享”与“写时复制”:从性能魔法到内存深坑
java·数据库·算法
程序猿ZhangSir31 分钟前
详解了解 Redis IO多路复用底层原理,Select,poll,epoll三者的区别?
数据库·redis·缓存
U-52184F6932 分钟前
深度解析:从 Qt 的 Q_D 宏说起,C++ 工业级 SDK 是如何保证 ABI 稳定性的
数据库·c++·qt
Gauss松鼠会32 分钟前
【GaussDB】LLVM技术在GaussDB等数据库中的应用
大数据·数据库·架构·数据库开发·gaussdb·llvm
IMPYLH39 分钟前
Linux 的 dir 命令
linux·运维·服务器·数据库
wfsm1 小时前
mysql事务
数据库·mysql
SadSunset1 小时前
第一章:Redis 入门介绍
数据库·redis·缓存
weixin_464307631 小时前
QT智能指针
java·数据库·qt
王仲肖2 小时前
PostgreSQL VACUUM 与 AUTOVACUUM 深度解析
数据库·postgresql
电商API&Tina2 小时前
电商数据采集API接口||合规优先、稳定高效、数据精准
java·javascript·数据库·python·json