Mysql

49 阅读2分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

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

MYIasmInnoDB
事务不支持支持
外键不支持支持
索引非聚集索引(支持FULLTEXT类型的全文索引)聚集索引
锁粒度
硬盘结构表定义,数据文件,索引文件表定义,数据和索引存储文件

完整性约束

1.实体完整性:对关系中记录的唯一性,就是主键的约束,还有唯一索引,唯一标识一行的属性

2.域完整性:字段的类型,值域,有效规则

3.参照完整性:外键约束,外键必须是另一个关系主键的有效值

4.用户自定义完整性

提问:回滚操作日志(undo log)什么时候删除?

MySQL会判断当没有事务需要用到这些回滚日志的时候,回滚日志会被删除。

提问:什么时候不需要了?

当系统里么有比这个回滚日志更早的read-view的时候。