Mysql 为什么是这样
说起Mysql 关系型数据库,它最大的特点数据特点就是 1)有索引,索引好比是目录有当你查询的需要的记录,直接查找 “name=zhangsan” 就可以找到相关的对象;2)就是存储呈树状结构,对比与hash 结构,hash 的查找时间复杂度是O(1)而 树是O(lg(1)),那为什么要选择树呢?那是因为方便进行排序,分组,比较。
为什么是B+树?
一:如果是其他二叉树,数据越多,树的高度越高,随着插入越多查找就会越慢,而且存储的节点越多,磁盘的IO 也越多。
二:如果是B树,B树的只有两层,B树的好处是索引可以存在内存里,数据存在磁盘上,加速查找,而且相似的数据以页(4K)的形式存储在磁盘上,容易批量读取所需的数据,提高效率。
三:B+树,B+树是在B树上的一种升级,B数非叶子节点不存储数据,数据只存储在同一层的叶子节点上,节点和节点之间用链表链接,方便范围查找,定位了min 和max 后就可以遍历所有数据。
高并发
Mysql 如何做到高并发,一般来说有两种手段,一种是锁,一种是数据多版本。
一:锁,锁就是对其他用户进行限制,锁有几种,一种是共享锁,读读可并行,一种是排他锁,写读,写写不并行。
二:就是数据多版本,数据多版本的核心就是当多个用户读一份数据但是同时存在写请求的时候,克隆一份数据进行修改,不影响原来的读取,过程如下:
T0 (写请求)(读请求)
T1 V0数据(读请求) 克隆V0(写请求)
T2 V0数据(读请求) 修改V1(写请求)
T3 提交V1 读V1
InnoDB的实现
InnoDB 通过使用 redo, undo 回滚段来实现事务,
redo: redo log,数据库通过把批量的命令收集起来,当有一定数量时再写入磁盘
undo: undo log, 数据库通过记录旧版本的数据,当数据库需要回滚时回滚到数据库
事务
回滚段用于保证数据库的ACID特性,ACID 特性是人为规定的
A: atomic 原子性,不可分割的单元,所有这些操作执行成功才成功
C:consistency 一致性,事务执行前后的业务规则是不变的
I:Isolation 隔离性,事务间是隔离的,不会互相干扰
D: Durability 持久性,数据被记录了存在磁盘上
当事务交替执行时,可能会出现以下情形:
读未提交:读到其他事务未提交的数据,但是事务回滚了
读已提交:读到其他事务已经提交的数据,但是会出现幻读和不可重复读(一个事务读取同一条数据出现不同情况,有可能其他事务进行了修改并且提交)
可重复读:同一个事务读取同一条数据一致