索引

1.数据库四大特性

​ A( Atomicity 原子性): 数据库最小的工作单元,整个工作单元要么一起提交成功,要么一起失败回滚。
​ C( Consistency 一致性): 事物中操作的数据的状态是一致的。即写入数据的结果必须完全符合预设的规则,不会因为出现系统意外等原因导致状态的不一致。
​ I( Isolation 隔离性): 一个事务所操作的数据在提交之前,对其他事务的可见性设定(一般设定为不可见)。
​ D( Durability 持久性): 数据库的数据一旦提交,无法更改。

2.多个事物并发引起的数据读取问题

​ 脏读: 是指一个事物读取到了另外一个事物未提交的数据。
​ 不可重复读: 是指在一个事物未结束之前, 前后两次读取到的数据不一致现象。原因在于该事物在前后两次读取数据之间,另外一个事物修改了该数据。(不可重复读的重点在于修改)。
​ 幻读: 是指当一个事物修改了数据库表中某一个范围内的数据的某一个字段,但是另外一个事物在此期间又在该范围内插入了一条新的数据,造成前一个事物出现幻觉(没有完全修改)。(幻读的重点在于新增或删除) 。

3.数据库事物的隔离级别

Read Uncommited 读未提交: 事物未提交对其它的事物也是可见的。
Read Commited 读已提交: 一个事物只能够读取到已提交的数据。(解决脏读, 未解决不可重复读)。
Repeatable Read 可重复读: 一个事物对数据的前后读取结果是一致的。(解决了不可重复读, 未解决幻读)。
Serializable 串行化: 数据库最高的隔离级别, 强制所有事物串行执行,解决了所有并发问题。

4.聚集索引和非聚集索引的区别
聚集索引: 表中的数据是按照索引的顺序来存储的。索引的叶子节点上存储了真实的数据,不会有另外单独的数据页。
非聚集索引: 表中的数据存储不依赖于索引的顺序。索引的叶子节点上存储了索引的关键字和指向真实数据的指针。

5.sql调优

​ a. 创建索引 b.使用临时表存储中间结果->(避免多次扫描主表)。c. 避免在索引上使用计算。4.少使用select *,只返回需要的字段。

6.如何理解MVCC

​ a. 数据库每张表会单独维护两个字段,数据行版本号和删除版本号。

​ b. 当执行insert操作时,我们开启了一个事物,执行数据插入操作时,会将这个事物的事物id设置到数据行版本号这个字段中(这个事物的事物id属于数据库一个全局属性,自增)。

​ c. 当执行delete操作时,我们开启了一个事物,执行数据删除操作时,会将这个事物的事物id设置到删除版本号这个字段中。

​ d. 当执行update操作时,我们开启了一个事物,指定数据更新操作时,会将这行数据copy一份,copy的这份数据数据行版本号为当前事物id,删除版本号为Null,并更新相关字段。原先那行的删除版本号会被设置为当前的事物id。

​ e. 当我们执行数据库查询时,满足以下两点要求:

​ e1:查找数据的数据行版本号小于或等于当前事物id。(保证该条数据在当前事物开启之前就已经存在或者为该事物添加的数据。

​ e2:查找数据的删除版本号为Null或者删除版本号大于当前事物id。(该条规则可以确保当前事物在开始之前数据还未被删除。

7.MVCC解决的问题与未解决的问题

若是一个查询先于一行的数据更新,不会出现问题。若是一个查询后于一行的数据更新,会产生脏读的问题。

8.Innodb数据库的四种隔离级别是如何实现的

​ 读未提交:对select操作不会加锁,并发性能是最好的,但是容易造成脏读。

​ 读已提交(互联网上默认的隔离级别):普通的数据读取是会直接读取数据快照,加锁的select,update等操作会使用记录锁。注意:读已提交读取快照时,一个事物读取了数据,但是当第二次读取的时候,另外一个事物已经将该快照刷新了,所以会造成不可重复读的问题。

​ 可重复读(Innodb默认的事物隔离级别):对于普通的数据库查询,使用读取快照的方式。对于加锁的select,update等语句,他们加锁的力度取决于查询条件是使用了唯一索引还是使用了范围查询。若是使用了唯一索引,会使用记录锁的方式。若是使用了范围查询,会使用间隙锁,避免发生不可重复读。注意:当一个事物开启读取数据时,前后两次读取的都是同一个快照,这样就可以实现了可重复读。

​ 串行化:针对所有的操作都会去加锁,普通的select操作会去加共享锁->select * from table in share mode。对于 update 等操作会加排他锁。若是一个事物查询操作时,正好有一个事物对改行的数据做修改操作。则该查询操作会阻塞,直到更新操作执行完成。

9.如何理解快照读和当前读

​ 快照读:读取的数据是快照。当前读:读取的数据是数据库的最新的数据。