理解Mysql底层B+tree索引机制
初识Mysql体系结构
整体结构图
-
Connectors
接入方支持协议很多
-
Management Serveices & Utilities
系统管理和控制工具,例如:备份恢复,mysql复制集群等
-
Connection Pool
连接池:管理缓冲用户连接、用户名、密码、权限校验、线程处理等需要缓存的需求
-
SQL Interface
SQL接口:接受用户的SQL命令,并且返回用户需要查询的结果。比如select from就是调用SQL Interface
-
Parser
解析器,SQL命令传递到解析器的时候会被解析器验证和解析。解析器是由Lex和YACC实现的。
-
Optimizer
查询优化器,SQL语句在查询之前会使用查询优化器对查询进行优化
-
Cache和Buffer(高速缓存区)
查询缓存,如果查询缓存有命中的查询结果,查询语句就可以直接去查询缓存中取数据。
-
Pluggable Storage Engines
插件式存储引擎。存储引擎是MySql中具体的与文件打交道的子系统。也是Mysql最具有特色的一个地方。 Mysql的存储引擎是插件式的。
-
File System
文件系统,数据、日志(redo,undo)、索引、错误日志、查询记录、慢查询等
运行时机理图
理解Mysql底层B+tree索引机制
写在前面的话
正确的创建合适的索引,是提升数据库查询性能的基础
索引是什么?
索引定义:
索引是为了加速对表中数据行的检索而创建的一种分散存储的数据结构
为什么要用索引?
索引意义:
索引能极大的减少存储引擎需要扫描的数据量
索引可以把随机IO变成顺序IO
索引可以帮助我们在进行分组、排序等操作时,避免使用临时表
为什么是B+Tree?
二叉查找树、平衡二叉树、多路平衡查找树、加强版多路平衡查找树
详细了解上面的数据结构可以参见帖子
二叉查找树,Binary Search Tree
每个分支最多有两个(路)
平衡二叉查找树,Balance binary search tree
平衡二叉树(AVL树)在符合二叉查找树的条件下,还满足任何节点的两个子树的高度最大差为1。
先了解下磁盘的相关知识。
系统从磁盘读取数据到内存时是以磁盘块(block)为基本单位的,位于同一个磁盘块中的数据会被一次性读取出来,而不是需要什么取什么。
X < 10 --> P1
X = 10 --> 命中
X > 10 --> P2
一个磁盘块:
绿色:关键字 (这里关键字就比如是id = 10)
蓝色:数据区(比如图上为 id 为 10 整条