【SQL】存储引擎及索引结构B/B+数

100 阅读2分钟

Mysql体系结构

  • 连接层:输入用户名密码,校验,授权认证,每个客户端权限,最大连接数
  • 服务层:
    • sql接口:DML(Data Manipulation Language)增删改查;DDL(Data Definition Language)新建、删除、alter
    • 解析器
    • 查询优化器
    • 缓存
  • 引擎层
    • 可插拔存储引擎:InnoDB-index
  • 存储层
    • 磁盘文件

存储引擎

存储引擎是建立存储结构,index,查询的依据。存储引擎是基于表的,而不是基于库的。

InnoDB介绍

mysql5.5之后默认InnoDB

  • 支持事务
  • 行级锁,提高并发访问性能
  • 支持外键

image.png

MyISAM和Memory

选择

image.png

索引

高效获取数据有序的数据结构。

mysql除了维护数据之外,还维护着满足特定查找算法的数据结构,这些数据结构以某种方式指向数据,通过这种数据结构实现高级查找算法,这种数据结构就是索引。

数据结构

思考一个问题:如果要查询一条记录,最简单的思路就是暴力法,全表扫喵

在插入时,就要维护索引这种数据结构,让节点指向数据位置

无索引,匹配n次;有索引,匹配3次 image.png

优点缺点
提高查询效率,降低io成本索引需要占用磁盘空间
用索引降低排序成本,降低cpu消耗降低更新表的速度,增删改的效率降低

Btree

  • 二叉树(顺序插入)

image.png

  • 红黑树(自平衡的二叉树) 大数据量情况下,层级较深,检索速度较慢

如何解决大数据量层级深的问题?
答:增加子节点

  • B树(多路平衡查找)

image.png

  • 动画演示B树演变过程:数据结构可视化网站

B+tree

所有的元素都会出现在叶子节点

image.png

  • 非叶子节点起到索引的作用;叶子节点存放数据
  • 叶子节点形成单向链表,有利于范围查找

mysql优化

image.png

每个橙色的块是一个页,InnoDB存储结构中一个页的大小为16k

hash

特点:

  • 只能用于对等比较=或in,不支持范围查询(between,>,<)
  • 无法利用索引排序
  • 查询效率高,通常只需检索一次,效率通常高于B+tree索引

支持: Memory引擎,或者利用InoDB的自适应hash功能

问题

为什么InnoDB存储引擎选择B+树索引结构?

image.png

  1. 相对于二叉树,层级更少,搜索效率高
  2. 对于B树来说,无论是叶子节点还是非叶子节点,都会保存数据,这样会导致一页中存储的键值减少,指针也跟着减少,所以,同样保存大量数据,利用B树会增加树的高度,从而导致性能降低
  3. 相对于hash所以,B+树支持范围匹配和排序操作