内容并不详细,但都是高频考察点,每个不熟悉的地方都应自行寻找拓展资料。
主要内容:
- 事务的原理,特性,并发控制
- 常用字段类型的含义与区别
- 常用数据库引擎之间的区别
1 事务的原理,特性,并发控制
事务(Transaction):
- 事务是数据库并发控制的基本单位
- 事务可以看作一系列SQL语句的集合
- 事务必须要么全部执行成功,要么全部执行失败(回滚)
例如转账操作,一方加,一方减,这两个操作必须为一个整体。
下面是Python的一个ORM框架的实现,可以体现出的事务中操作的整体性:
session.begin()
try:
item1 = session.query(Item).get(1)
item2 = session.query(Item).get(2)
item1.foo = 'bar'
item2.bar = 'foo'
session.commit()
except:
session.rollback()
raise
事务的ACID特性:
- 原子性(Atomicity),一个事务中全部操作同时成功,或同时失败
- 一致性(Consistency),事务结束后数据完整性不被破坏
- 隔离性(Isolation),允许多个事务同时对数据库进行读写与修改
- 持久性(Durability),事务结束后,修改是永久的,不会丢失
不进行并发控制会出现异常:
- 幻读(phantom read),一个事务第二次查,出现第一次没有的结果
- 非重复读(noreaptable read),一个事务读两次,得到不同结果
- 脏读(dirty read),一个事务读到另一个事务没有提交的事务
- 丢失修改(lost update),并发写入导致其中一些修改丢失
四种事务隔离级别:
- 读未提交(read uncommitted),别的事务可以读取到未提交改变
- 读已提交(read committed),只能读取已提交的事务
- 可重复度(repeatable read),同一事务先后查询结果一样,是MySQL InnoDB的默认级别
- 串行化(Serializable),事务完全串行执行
隔离级别越高,执行效率越低。
如何解决高并发场景下的插入重复问题:
- 使用数据库的唯一索引,则重复插入时,数据库层面会抛出异常
- 使用队列进行异步写入
- 使用redis实现分布式锁
并发控制就是在事务进行写入时加锁(包括行锁和列锁)
悲观锁和乐观锁:
- 悲观锁先获取锁,再进行操作(一锁二查三更新,select for update,操作前就认为有别的事务也要更新它)
- 乐观锁先执行修改,更新时发现数据变了就回滚(check and set,通过版本号、时间戳实现)
- 需要根据响应速度、冲突频率和重试代价综合起来选择合适的锁
2 常用字段类型的含义与区别
字符串类型(文本):
类型 | 占用空间 | 长度范围 |
CHAR[Length] | Length (bytes) | 定长串,0-255 |
VARCHAR[Length] | String Length + 1 or 2 (bytes) | 变长串,0-65535 |
TEXT | String Length + 2 (bytes) | 文本,最大65535 |
数值类型:
类型 | 占用空间 |
TINYINT[Length] | 1 byte |
SMALLINT[Length] | 2 bytes |
MEDIUMINT[Length] | 3 bytes |
INT[Length] | 4 bytes |
BIGINT[Length] | 8 bytes |
FLOAT[Length,Decimal] | 4 bytes |
DOUBLE[Length, Decimal] | 8 bytes |
Length代表数据库中显示的字符宽,与占用空间的大小,所能表示的范围无关。
日期类型:
类型 | 占用空间 | 格式 |
DATE | 3 bytes | YYYY-MM-DD |
DATETIME | 8 bytes | YYYY-MM-DD HH:MM:SS |
TIMESTAMP | 4 bytes | YYYYMMDDHHMMSS |
TIMESTAMP类型可表示范围为[1970, 2038]。
3 常用数据库引擎之间的区别
两种常用引擎InnoDB和MyISAM的区别:
- InnoDB支持事务,外键;而MyISAM不支持
- InnoDB支持行锁和表锁;而MyISAM只支持表锁
- InnoDB不支持全文索引;而MyISAM支持
- 二者在聚集索引与非聚集索引上存在差异
聚集索引与非聚集索引:
- 聚集与非聚集指的是B+树的叶节点存的是数据记录还是指针(聚集——数据记录,非聚集——指针)
- MyISAM索引和数据分离,均为非聚集索引,需要两个文件进行存储(.MYD文件和.MYI文件)
- InnoDB的数据文件就是索引文件,主键索引是聚集索引,所以叶节点既有索引,又有具体数据内容(文件后缀.ibd)
- InnoDB的其他索引(辅助索引),叶节点存的是主键值,再通过主键进行索引(所以辅助索引要慢)