mysql知识点总结

mysql事务

什么是事务

事务就是数据库操作的最小单元。一个事务里面包含诺干逻辑要么全部成功要么全部失败。事务是一组不可
再分割的操作集合。

事务的四大特性

1. 原子性: 事务包含的操作逻辑是不可再分的。要么全部成功。要么全部失败

2. 一致性: 是对数据的可见性的约束,就是所有数据要么是事务开始前的样子.要么全是结束的样子,不
存在中间过渡是的数据。

3. 隔离性: 事务与事务之间是不受影响的。

4. 持久性: 事务一旦提交,那么它对数据库的改变应该是永久的。接下来的操作或者故障不会对其有影响。

事务的隔离级别

1. 读未提交: 事务可以看见其他的事务还没提交的修改. 比如一个事务a在对一行数据进行修改,修改完后又删除.
这整个过程对于别的事务来说都是透明的.这个级别的事务就基本没有隔离性.

2. 读以提交: 事务只能够看到其他的事务已经提交后的修改,当前的事务运行的时候可能会有多个事务已经对某行
数据进行了修改,并且已经提交,所以多次查询同一行的数据可能会不一样.所以又被成为"不可重复读".

3. 可重复读: 事务在这个级别有数据版本控制,只会看到事务一开始的数据版本,所以数据不管读多少次都是一样的
是innodb的默认级别.

4. 串行化:   事务完全串行的执行.隔离级别最高,但是性能很差.

脏读,不可重复读,幻读分别是什么

* 脏读:事务a对数据库进行了修改还没提交, 这个数据被事务b看到了并且使用,事务a因为一些原因撤销了数据,事务
b就相当于发生了脏读.
* 不可重复读:事务a在运行的时候可能会因为有多个事务的提交而对同一行数据进行查询多次结果不一样. 
* 幻读:当事务a查找多行数据的时候,可能会因为事务b的插入或者删除而影响到.
隔离级别 脏读 不可重复读 幻读
读未提交
读以提交 不会
可重复读 不会 不会
串行化 不会 不会 不会

mysql不同级别的事务是怎么实现的

原子性:首先事务的原子性规定了事务要么全部成功要么全部失败. 这是通过mysql的undo log 来实现的.举个例子
当事务a对行数据加了5,undo log就会生成一个减5的log.当事务执行到一半失败了进行回滚 就会运行undo log
上的相关sql.

持久性:事务一旦提交数据就会生效,即使数据库崩溃数据也不会丢失,这是因为mysql在提交的那一刻就sql语句就已
经被记录在redo log里.

隔离性:级别越低的隔离性所能够承受的并发越高.不同的隔离性的实现其实就是(读写锁和mvcc的不同运用).首先最
低级别的读未提交允许同一时间读写并行,同一时间一行数据只能被一个事务修改.正因为读不加锁,所以会出现脏读的
情况.读已提交: 事务中每次查询都会生成一个数据版本,所以每次查询都会读到当前最新的数据,可重复读:事务一开
始的时候就会生成一个数据版本号,所以不管数据怎么查都是查到指定版本数据。串行化:所有事务按照顺序执行。

mysql索引

什么是索引

索引是对数据库表中的一列或多列的值进行排序的一种结构,使用索引可以提高数据库的查询速度。索引是一个单独的
存储在磁盘上的数据库结构,它们包含着对数据库表里所有记录的引用指针。

hash和b+ tree索引的优劣

* hash索引只能精确查找做等值查询,不能范围查找,查找速度比 b+tree速度快很多.hash索引占用磁盘空间较大因为
有很多没有命中的hash槽浪费了空间。

* b+tree 支持联合索引的最左匹配原则。支持模糊查找。范围查找。一般情况下比hash速度慢,但是性能稳定。

聚簇索引和覆盖索引和回表

* 聚簇索引:就是索引最终直接指向整行数据。一般就是主键索引。如果没有设置主键,innodb底层会选择一个唯一
的非空的索引代替。如果没有这样的索引,innodb就会隐式的定义一个主键来作为聚簇索引。当走这个索引查询数剧
就只需要查询完成就能够获得到目标数据。

* 回表:当sql走的不是聚簇索引的时候,该索引的叶子指向聚簇索引的id。mysql会通过当前索引找到主键id。然后
拿到主键id去查询主键索引。这个过程就称之为回表,回表的话相当于要走多个索引性能相对来说会慢点。

* 覆盖索引:举个例子 索引a 是字段a,b的联合索引,如果一个 sql语句通过 索引a 查找字段a,b 。那么当前的索
引已经能够查到所需要的数据,所以就不需要回表查询主键索引。

为什么选b+tree 作为索引的数据结构

* b+ tree 的节点会存多个子节点,比起b tree 。b+ tree的数据全部存在叶子节点,非叶子节点只会存键。这样
能够存更多的关系数据。能够更快的命中。树高越低,磁盘io次数越少。b+树的树高 < b树高 < 平衡二叉树

* 更加适合范围查找:在b树进行范围查找是,要先找到查找的下限,然后对b树进行中序遍历,直到找到查找的上限,
而b+树的范围查找,只需要对链接进行遍历即可。

* b tree 的查询复杂度在 1 到树高之间,而b+树的查询复杂度稳定为树高,因为所有数据节点都在叶子节点。

存储引擎 MYISAM 和 INNODB 的区别

1. myisam 只支持表锁,innodb支持行级锁
2. myisam 不支持事务, innodb支持
3. myisam 的表结构 数据 索引是单独存放的。innodb是索引和数据是放一起的
4. select count(*) from table 的时候myisam 不需要遍历整表因为它对总行数有保存,innodb 需要遍历。
5. myisam支持全文索引,innodb不支持。

Mysql死锁

原因

多个事务在不同的资源占用后,并且请求对方占用的资源。并且不释放。导致逻辑卡死。

死锁检测

innodb能检测到死锁的循环依赖,并立即返回错误,但是涉及到外部锁,或者表锁的情况下,innodb不能完全检测
到。需要设置锁等待超时时间 innodb_lock_wait_timeout来解决。

死锁恢复

死锁发生后只有部分或者完全回滚其中一个事务,才能打破死锁。innodb 现在就是将持有最少的行级排它锁的事务
进行回滚。

myisam会不会产生死锁

不会。因为myiasm在事务一开始的时候就会先获取自己所需要的所有锁。所以不会发生死锁的情况。

innodb死锁避免

1. 可以在事务一开始的时候先尝试获得所有需要的锁。获得了再进行操作。`SELECT ... FOR UPDATE`
2. 不同的事务尽量以相同的顺序访问表。这样加锁流程也会一样。也会降低死锁产生的机会
3. 改变事务隔离级别

你可能感兴趣的:(mysql知识点总结)