1.事物四大特性(ACID)
-
原子性:一个事务是不可再分割的个体,要么全部成功,要么全部失败。
-
一致性:一个事务可以让数据从一种一致性状态转变为另一种一致性状态。
-
隔离性:一个事务不会被其他事务干扰,事务之间相互隔离。
-
持久性:一个事务一旦提交,在数据库中的改变就是永久的,提交后的事务不可以回滚。
2.隔离级别(读已提交、未提交,可重复度,串行化).
- 读已提交:两个事务同时执行的情况下,A事务执行查询操作,B事务执行插入操作,当事务B在执行过程中未提交的前提下,A事务不能读取到正在执行插入的这条数据信息。
- 读未提交:同样是两个事务A事务查询,B事务插入,在B事务正在执行未提交事务的前提下,A事务可以读取到B正在执行插入的这条数据信息。
- 可重复读:A事务执行两次读操作,执行期间B事务执行插入语句并且提交事务,但是A事务(事务A没有执行提交的前提下)在读取数据信息时第二次读取到的数据信息还是与第一次读取到的数据信息保持一致。
- 串行化:A事务在执行读操作的时候,其他事务可以并发读但不能并发写,A事务在执行写操作时,加排它锁,其他任何事物都不能并发读写。
3.脏读、幻读、不可重复读
- 脏读:事务A执行查询语句,事务B执行插入语句,当事务A在执行的过程中,事务B执行插入语句,这时候A事务读取到了B事务执行的这条数据信息,但是事务B最终没有提交,并且回滚了,按理说事务A不应该能读取到这条数据,这时就会发生脏读这种情况,这种情况出现在读未提交这种隔离级别下。
- 不可重复读:事务A在执行读操作时,B事务在A事务进行读取操作的时候修改了A事务正在读取的数据并执行提交,导致事务A(没有提交)在进行第二次读取数据的时候发现与第一次读取到的数据不一样。
- 幻读:事务A要修改全表的数据,这时候事务B在事务A执行的过程中插入了一条数据并执行了提交,事务A在执行完更新操作后,发现有一条数据没有更改。就跟出现幻觉一样。
4.索引
4.1 索引模型:
4.1.1 K-V键值对:无序的,哈希表适合等值查询。
4.1.2 数组:有序,适合等只查询,区间查询,二分法查询方式,因为数组增删效率慢,所以其只适合做静态存储引擎
4.1.3 搜索树:
4.2 索引种类:主键索引(聚簇索引)、 覆盖索引、联合索引、唯一索引
4.3 索引在InnoDB搜索引擎中是以B+Tree的形式存储的,表都是以索引的方式存放的,称为索引组织表;
4.4 索引介绍:
4.4.1 主键索引查询:主键查询方式只需要搜索B+Tree这个树,就可以快速过滤出要查询的数据,
4.4.2 普通索引:先搜索字段索引树,查询到主键的值再根据主键的值再去查一遍索引树这个时候就需要两次查询,这种查询方式又称为回表查询。采用主键索引这种查询方式可以有效提高查询效率。
4.4.3 覆盖索引:是指当我们需要根据普通索引字段查询主键索引的时候,这样的情况下只需要搜索普通索引树即可,无需再去会标搜索主键索引树,可以减少输的搜索次数,显著提高查询性能,所以使用覆盖 索引是一个常用的性能优化手段。
4.4.4 联合索引:将两个常作为查询的字段组成一起创建出来的索引叫联合索引,这里边需要注意一个原则叫最左前缀匹配原则,该原则规定了联合索引在何时才会生效。如果想使用联合索引,联合索引最左边的列必须作为过滤条件,否则不生效,也就是说联合索引拥有单列索引的作用。
4.5 存储空间:在InnoDB搜索引擎中,采用B+Tree这种索引模式来储存索引,由于每个非主键缩印的叶子节点上都是逐渐的值。如果用身份证号做主键,那么每个二级索引的叶子结点占用约20个字节,而如果用整形做主键,则只需要4个字节,长征性则为八个字节。显然,主键长度越小,普通索引的叶子结点就越小,普通索引占用的空就按就越小。
5.行锁表锁,共享锁。排它锁
- 行锁:触发场景,当对表数据进行更新操作时,伴随条件为索引时,只要对数据执行update,就会触发行锁。目的:防止其他事务对该条数据进行读操作时出现脏读以及死锁情况的发生。
- 表锁:当update操作中伴随条件没有涉及到索引时这时候会触发表锁,表锁一旦发生,表中的任何数据无法被修改,当对数据进行插入操作时,会锁行
- 共享锁:允许其它事务读,不允许写
- 排它锁:不允许其他事物读写