Mysql体系结构
- 连接层:输入用户名密码,校验,授权认证,每个客户端权限,最大连接数
- 服务层:
- sql接口:DML(Data Manipulation Language)增删改查;DDL(Data Definition Language)新建、删除、alter
- 解析器
- 查询优化器
- 缓存
- 引擎层
- 可插拔存储引擎:InnoDB-index
- 存储层
- 磁盘文件
存储引擎
存储引擎是建立存储结构,index,查询的依据。存储引擎是基于表的,而不是基于库的。
InnoDB介绍
mysql5.5之后默认InnoDB
- 支持事务
- 行级锁,提高并发访问性能
- 支持外键
MyISAM和Memory
选择
索引
高效获取数据的有序的数据结构。
mysql除了维护数据之外,还维护着满足特定查找算法的数据结构,这些数据结构以某种方式指向数据,通过这种数据结构实现高级查找算法,这种数据结构就是索引。
数据结构
思考一个问题:如果要查询一条记录,最简单的思路就是暴力法,全表扫喵
在插入时,就要维护索引这种数据结构,让节点指向数据位置
无索引,匹配n次;有索引,匹配3次
| 优点 | 缺点 |
|---|---|
| 提高查询效率,降低io成本 | 索引需要占用磁盘空间 |
| 用索引降低排序成本,降低cpu消耗 | 降低更新表的速度,增删改的效率降低 |
Btree
- 二叉树(顺序插入)
- 红黑树(自平衡的二叉树) 大数据量情况下,层级较深,检索速度较慢
如何解决大数据量层级深的问题?
答:增加子节点
- B树(多路平衡查找)
- 动画演示B树演变过程:数据结构可视化网站
B+tree
所有的元素都会出现在叶子节点
- 非叶子节点起到索引的作用;叶子节点存放数据
- 叶子节点形成单向链表,有利于范围查找
mysql优化
每个橙色的块是一个页,InnoDB存储结构中一个页的大小为16k
hash
特点:
- 只能用于对等比较=或in,不支持范围查询(between,>,<)
- 无法利用索引排序
- 查询效率高,通常只需检索一次,效率通常高于B+tree索引
支持: Memory引擎,或者利用InoDB的自适应hash功能
问题
为什么InnoDB存储引擎选择B+树索引结构?
- 相对于二叉树,层级更少,搜索效率高
- 对于B树来说,无论是叶子节点还是非叶子节点,都会保存数据,这样会导致一页中存储的键值减少,指针也跟着减少,所以,同样保存大量数据,利用B树会增加树的高度,从而导致性能降低
- 相对于hash所以,B+树支持范围匹配和排序操作