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 执行计划

返回列对应的如下

ColumnJSON NameMeaning
idselect_idThe SELECT identifier 
select_typeNoneThe SELECT type 选择类型
tabletable_nameThe table for the output row 选择的表,也可能是常量
partitionspartitionsThe matching partitions 表分区
typeaccess_typeThe join type 
possible_keyspossible_keysThe possible indexes to choose
keykeyThe index actually chosen
key_lenkey_lengthThe length of the chosen key
refrefThe columns compared to the index
rowsrowsEstimate of rows to be examined
filteredfilteredPercentage of rows filtered by table condition
ExtraNoneAdditional information 可能会有order by 导致的filesort等问题,显示索引覆盖

MyBatis

实现方式:使用JDK动态代理
缓存
一级缓存:session级别,默认开启

二级缓存:namespace级别,可在多个session共享,默认关闭