数据库常见面试题
什么是事务:
- 数据库事务是指作为单个逻辑工作单元执行的一系列操作(sql语句),这些操作要么全部执行,要么全部不执行。
事务的四大特性
- 原子性:
- 事务中的所有操作是不可再分割的原子单位,要么执行,要么不执行
- 一个事务中的操作,要么全部成功,要么全部失败
- 如果全部失败,就回滚到事务开始前的状态
- 隔离性:
- 一个事务执行的过程中,不应该受到其它事务的干扰
- 当多个用户并发的访问数据库中时,如果操作同一张表,数据库则为每一个用户都开启一个事务,且事务之间互不干扰,也就是说事务之间的并发是隔离的
- 举个例子,现有两个并发的事务T1,T2,T1要么在T2开始前执行,要么在T2结束后执行,如果T1先执行,那T2就在T1结束后再执行
- 一致性
- 事务的执行的前后数据的完整性保持一致
- 事务必须使数据库从一个一致性状态变换到另一个一致性状态,也就是说一个事务执行之前和执行之后都必须处于一致性状态
- 拿转账举例子,A账户和B账户相互转账,无论如何操作,A,B账户的总金额必须是不变的。
- 同步更新
- 持久性:
- 一旦事务提交,对数据的改变是永久的,持久到数据库中
- 即使断电或宕机情况下,也不会丢失提交事务的操作。
数据库的隔离级别
- 多个事务读可能会导致以下问题
- 脏读:事务B读取事务A还没有提交的数据
- 不可重复度:是指在数据库的访问中,一个事务范围内两个相同的查询返回了不同数据。这是由于在查询过程中,数据被另外一个事务修改并提交了。
- 幻读:当在事务处理过程中执行两个相同的查询,并且第二个查询返回的行集合与第一个查询不同。这两个区别在于,不可重复读重点在一行,幻读的重点是返回的集合不一样。幻读和不可重复读都是读取了另一条已经提交的事务(这点就脏读不同),所不同的是不可重复读查询的都是同一个数据项,而幻读针对的是一批数据整体(比如数据的个数)。
隔离级别 | 脏读 | 不可重复度 | 幻读 |
---|---|---|---|
READ UNCOMMITTED(读未提交) | 可能 | 可能 | 可能 |
READ COMMITTED(读已提交) | 不可能 | 可能 | 可能 |
REPEATABLE READ(可重复读) | 不可能 | 不可能 | 可能 |
SERIALIZABLE(串行化) | 不可能 | 不可能 | 不可能 |
Mysql的两种存储引擎的区别(事务,锁级别等等),各自适用的场景
引擎 | 特性 |
---|---|
MYISAM | 不支持外键,表锁。插入数据时,锁定整个表,查表总行数时,不需要全表扫描 |
InnoDB | 支持外键,行锁,查表总数时,全表扫描 |
InnoDB:
-
支持行级锁,行级锁可以最大程度的支持并发,行级锁是由存储引擎层实现的。
-
InnoDB是为处理巨大数据量的最大性能设计。它的CPU效率可能是任何基于磁盘的关系数据库引擎所不能匹敌的。
-
InnoDB存储引擎完全与MySQL服务器整合,InnoDB存储引擎为在主内存中缓存数据和索引而维持它自己的缓冲池。InnoDB将它的表和索引在一个逻辑表空间中,表空间可以包含数个文件(或原始磁盘文件)
-
InnoDB支持外键完整性约束,存储表中的数据时,每张表的存储都按照主键顺序存放,如果没有显示在表定义时指定主键,InnoDB会为每一行生成一个6字节的ROWID,并以次作为主键。
-
InnoDB中不保存表的行数(eg:select count(*)from table时,InnoDB需要扫描一遍整个表来计算有多少行);清空整个表时,InnoDB是一行一行的删除,效率非常慢;
索引有B+索引和hash索引
索引 | 区别 |
---|---|
Hash | hash索引,等值查询效率高,不能排序,不能进行范围查询 |
B+ | 数据有序,范围查询 |
聚集索引和非聚集索引
索引 | 区别 |
---|---|
聚集索引 | 数据按索引顺序存储,中子结点存储真实的物理数据 |
非聚集索引 | 存储指向真正数据行的指针 |