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

相关推荐
码力引擎1 天前
【零基础学MySQL】第一章:MySQL介绍与安装
数据库·mysql·1024程序员节
Sam_Deep_Thinking1 天前
MySQL 8 索引与 B+ 树-初浅理解
mysql
235161 天前
【MySQL】慢查寻的发现和解决优化(思维导图版)
java·后端·sql·mysql·职场和发展·数据库开发·数据库架构
小超嵌入式笔记1 天前
【Keil5教程及技巧】耗时一周精心整理万字全网最全Keil5(MDK-ARM)功能详细介绍【建议收藏-细细品尝】
java·数据库·mongodb
hweiyu001 天前
Node.js+Koa2+MySQL 打造前后端分离项目(视频教程)
数据库·mysql·node.js
isNotNullX1 天前
一文讲清:数据清洗、数据中台、数据仓库、数据治理
大数据·网络·数据库·数据分析·1024程序员节
penguin_bark1 天前
C++调用MySQL数据库完整教程
数据库·c++·mysql
曾凡宇先生1 天前
无法远程连接 MySQL
android·开发语言·数据库·sql·tcp/ip·mysql·adb
苏小瀚1 天前
[MySQL] 事务和视图
数据库·mysql·1024程序员节
刺客-Andy1 天前
Python 第二十节 正则表达式使用详解及注意事项
python·mysql·正则表达式