一、编码字符集
- 常用的utf8mb3无法存储一些表情,如果想要存储表请需要使用进行utf8mb4。因为为了性能,MySQL的utf-8默认是utf8mb3,也就是最长是3个字节的编码,而不是4个字节的编码的utf8mb4。
- 通信过程中的字符集的设置
a. 客户端发送的时候的编码方式:windows下default-character-set
b. 服务端接收消息默认的编码方式:character_set_client
c. 运行中的编码方式:character_set_connection
d. 返回客户端的时候的编码方式:character_set_results
e. 客户端接受道消息的时候:除了操作系统自带的字符集,还受到default_character_set
影响 - 比较规则:
a. 每种字符集都有自己默认的比较规则
b. 只修改字符集,比较规则也会跟着变化,如果只修改比较规则,字符集也会随着变化 - 字符集和比较规则包括:
服务器,数据库、表、列
四个级别,每一个级别没有设置就使用上一级别的
二、MVCC
MySQL的事务隔离级别
- 四种隔离级别分别是什么?分别解决了什么问题?MySQL的默认隔离级别
- undo日志的版本链 + ReadView:
a. Read commit和Repeatable Read生成一致性视图的时机不一致,分别什么情况下生成?
b. ReadView包含哪些属性?
c.undo日志的版本连包含哪些属性? - purge:update的undo日志的删除
- MySQL的Repeatable Read隔离可以避免幻读吗?能避免什么情况下的幻读,不能避免什么情况下的幻读?
三、锁
- 锁退化的情况
- 不加锁的情况:MVCC,在可重复读的隔离级别下,进行非加锁的读语句
- 加锁的情况:
a. 锁定读:序列化读 + 自动提交为0的情况;显示加锁(in share mode;for update)
b. 更新操作 - 锁的类型:行锁,表锁
a. 表锁:在没有意向锁的情况可以进行加锁;InnoDB的表锁非常的鸡肋,除了会在DDL和数据库崩溃恢复的情况下,基本都用不到;可以手动加上表锁
b. 行锁(Gap Lock,Record Lock,Next-Key Lock):防止幻读的 - 锁的类型:共享锁,排他锁,意向锁
- 锁结构:锁类型(行锁结构/表锁结构);锁模式(共享、排他、意向锁)
- 加锁分析条件:
a. 执行的SQL语句 :决定了是否需要加锁(除了一致性读之外其他的都会加锁)
b. 事务隔离级别:决定了是否加锁,以及加什么锁
c. 索引类型
d. 是否是精确匹配
e. 是否是唯一性搜索 - 加锁分析实例:7步
- 查看当前数据库事务的情况的SQL语句
information_schema.INNODB_TRX
10.查看当前数据库死锁情况的show engine innodb status