1、基础
1.1、事务隔离级别
- READ-UNCOMMITTED(读取未提交) : 最低的隔离级别,允许读取尚未提交的数据变更,可能会导致脏读、幻读或不可重复读。(通过MVCC实现)
- READ-COMMITTED(读取已提交) : 允许读取并发事务已经提交的数据,可以阻止脏读,但是幻读或不可重复读仍有可能发生。(通过MVCC实现)
- REPEATABLE-READ(可重复读) : 对同一字段的多次读取结果都是一致的,除非数据是被本身事务自己所修改,可以阻止脏读和不可重复读,但幻读仍有可能发生。(mysql默认,通过MVCC实现)
- SERIALIZABLE(可串行化) : 最高的隔离级别,完全服从 ACID 的隔离级别。所有的事务依次逐个执行,这样事务之间就完全不可能产生干扰,也就是说,该级别可以防止脏读、不可重复读以及幻读。(通过锁实现)
1.2、表锁和行锁
MyISAM 仅仅支持表级锁(table-level locking),性能非常差,所以不用它。InnoDB 不光支持表级锁(table-level locking),还支持行级锁(row-level locking),默认为行级锁。
InnoDB 的行锁是针对索引字段加的锁,表级锁是针对非索引字段加的锁。当我们执行 UPDATE、DELETE 语句时,如果 WHERE条件中字段没有命中唯一索引或者索引失效的话,就会导致扫描全表对表中的所有行记录进行加锁。
1.3、共享锁和排他锁
不论是表级锁还是行级锁,都存在共享锁(Share Lock,S 锁)和排他锁(Exclusive Lock,X 锁)这两类。 排他锁与任何的锁都不兼容,共享锁仅和共享锁兼容。
| S 锁 | X 锁 | |
|---|---|---|
| S 锁 | 不冲突 | 冲突 |
| X 锁 | 冲突 | 冲突 |
由于 MVCC 的存在,对于一般的 SELECT 语句,InnoDB 不会加任何锁。不过, 你可以通过以下语句显式加共享锁或排他锁。 |
# 共享锁
SELECT ... LOCK IN SHARE MODE;
# 排他锁
SELECT ... FOR UPDATE;
2、如何实现高性能
2.1、数据库命令规范
2.2、数据库基本设计规范
2.3、数据库字段设计规范
2.4、索引设计规范
2.5、数据库 SQL 开发规范
2.6、数据库操作行为规范
3、索引详解
3.1、底层数据结构
3.2、类型
3.3、聚集索引与非聚集索引
3.4、覆盖索引
3.5、联合索引
3.6、最左前缀匹配原则
3.7、索引下推
3.8、创建索引
4、三大日志
4.1、binlog
4.1、redo log
4.1、undo log
5、MVCC
5.1、InnoDB 对 MVCC 的实现
5.2、RC 和 RR 隔离级别下 MVCC 的差异
5.3、MVCC 解决不可重复读问题
5.4、MVCC➕Next-key-Lock 防止幻读
6、SQL执行过程
6.1、MySQL 基础架构分析
6.1.1、MySQL 基本架构概览
6.1.2、Server 层基本组件介绍
6.2、语句分析
6.2.1、查询语句
6.2.2、更新语句
7、其它
7.1、时间类型数据存储建议
切记不要用字符串存储日期,还有Datetime、Timestamp、数值型时间戳三种选择。通常我们都会首选Timestamp,DateTime类型没有时区信息,而且耗费空间更大,数值型时间戳表示时间不够直观。