- 事务特点:ACID
- 隔离级别
- MVCC
- undolog,redolog
- 锁,行级锁
- 查询优化
- 索引分类
ACID
A 原子性,要么成功要么失败
C 一致性 总是从一个一致状态到另外一个一致的状态
I 隔离性 一个事物提交前通常对另外的事物不可见
D 持久性 事务成功结果保存
隔离级别
READ UNCOMMITTED 未提交对于其它事务可见-脏读
READ COMMIT - 幻读,事务之内,两次读取结果可能有不一致
REPEATABLE READ InnoDB 可以解决幻读问题
SERIALIZABLE 串行 -性能低
MVCC
多版本并发控制,通过对数据行添加版本(事务版本)和删除时间列,判断数据行的更新时间,当update时会追加行,根据不同的隔离级别,读取不同的版本行,只在READ COMMITED和REPEATABLE READ中有效。
undo log/redo log
undo log 用于保存被活跃事务更改的数据副本的存储区域与InnoDB的MVCC有关
redo log 用于数据灾难再恢复的存储结构,修正完成但未保存的事务数据,与 InnoDB 通过doublewrite buffer构建
锁,行级锁
在使用 SELECT ... IN SHARE MODE或者 SELECT ...FOR UPDATE 或者 DELETE,UPDATE时会产生锁
InnoDB默认隔离级别为REPEATABLE READ
当使用唯一查询条件查询唯一索引时,使用行级锁
其余为gap lock或者next key lock 详见文档
InnoDB默认会自动检测死锁(参数innodb-deadlock-detect),并尝试自动回滚导致死锁的事务,如果禁用自动检测,需要发生死锁后可用 SHOW ENGINE INNODB MUTEX 查看锁状态
VARCHAR 和CHAR
VARCHAR和CHAR都可以制定长度,CHAR类型的数据保存都是固定长度(0-255),用space补齐,而VARCHAR是变长的,长度受行最大长度限制(65535),注意:尾随的space会被去掉
索引
B树结构(多路搜索树,所有叶子节点均在统一层级)
原因:对标二叉树, 磁盘读写较慢,因此需要减少io次数,多路搜索树能够一次读入多个节点
B+树特点 所有数据均保存在叶子节点,查询时间基本一致
Explain 执行计划
返回列对应的如下
Column | JSON Name | Meaning |
---|---|---|
id | select_id | The SELECT identifier |
select_type | None | The SELECT type 选择类型 |
table | table_name | The table for the output row 选择的表,也可能是常量 |
partitions | partitions | The matching partitions 表分区 |
type | access_type | The join type |
possible_keys | possible_keys | The possible indexes to choose |
key | key | The index actually chosen |
key_len | key_length | The length of the chosen key |
ref | ref | The columns compared to the index |
rows | rows | Estimate of rows to be examined |
filtered | filtered | Percentage of rows filtered by table condition |
Extra | None | Additional information 可能会有order by 导致的filesort等问题,显示索引覆盖 |
Due to the key storage format, the key length is one greater for a column that can be
NULL
than for aNOT NULL
column. 空的列比非空的列更长
MyBatis
二级缓存:namespace级别,可在多个session共享,默认关闭