本文已参与「新人创作礼」活动,一起开启掘金创作之路。
B+树
叶子子节点有指针相互引用,一个节点存放多条数据,非叶子节点不保存数据,只起索引的效果,所以叶子节点保存了所有的元素,而且是有序的。
因为一个节点可以存储多个元素,所以树的高度不会太高,提高了查询效率,叶子节点有指针,更好的支持全表扫描,范围查找
索引
帮助mysql高效获取数据的排好序的数据结构
索引失效
1.最左匹配原则
2.> <后
3.模糊查询 %在左边
4.or
5.in
事务(一系列sql语句的集合,数据库执行的最小单元)
原子性:事务是一个不可在分割的工作单位,事务的操作要么都发生,要么都不发生
隔离性:并发的事务是相互隔离的,事务正在操作的数据不会被其他事务看到
一致性:事务前后,数据库的完整性约束不会被破坏
持久性:事务完成之后,对数据库的更改会持久保存在数据库中,不会被回滚。
隔离性
事务隔离级别解决的问题:
脏读:读到其他事物未提交的数据
不可重复读:一个事物读到另一个事物已提交修改过的数据,并且其他事物每对数据进行一次更改,这个事物永远都能读到最新值(update)
幻读:一个事物根据某些条件查出一些数据,另一个事物又向表中插入了符合条件的数据,这个事物再次查询时,能把另一个事物插入的数据读出来(insert)
事物的隔离级别:
读未提交
读以提交
可重复读
串行化:读写阻塞,写读阻塞,写写阻塞
| 读未提交 | 读以提交 | 可重复读 | 串行化 | |
|---|---|---|---|---|
| 脏读 | √ | |||
| 不可重复读 | √ | √ | ||
| 幻读 | √ | √ | √ |
日志
回滚操作日志 undo log
每一个查询都会创建一个readview,记录当前活跃的事务(m_ids),最小事务(min_trx_id),下一个要分配的事务(max_trx_id),创建这个readview的creator_trx_id
undo log读到的id == creator_id,可以访问,自己事务处理的数据
id < min_trx_id,可以访问,事务已经提交了
id > max_trx_id,不可以访问
id IN mid_s,不可以,当前事务还是活跃的,否则可以,事务已经提交了
对每个查询都创建一个readview, 解决了读未提交
对一个事务创建一个readview,解决了不可重复读
MYIasm or InnoDB
| MYIasm | InnoDB | |
|---|---|---|
| 事务 | 不支持 | 支持 |
| 外键 | 不支持 | 支持 |
| 索引 | 非聚集索引(支持FULLTEXT类型的全文索引) | 聚集索引 |
| 锁粒度 | 表 | 行 |
| 硬盘结构 | 表定义,数据文件,索引文件 | 表定义,数据和索引存储文件 |
完整性约束
1.实体完整性:对关系中记录的唯一性,就是主键的约束,还有唯一索引,唯一标识一行的属性
2.域完整性:字段的类型,值域,有效规则
3.参照完整性:外键约束,外键必须是另一个关系主键的有效值
4.用户自定义完整性
提问:回滚操作日志(undo log)什么时候删除?
MySQL会判断当没有事务需要用到这些回滚日志的时候,回滚日志会被删除。
提问:什么时候不需要了?
当系统里么有比这个回滚日志更早的read-view的时候。