Mysql

148 阅读3分钟

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 的行锁是针对索引字段加的锁,表级锁是针对非索引字段加的锁。当我们执行 UPDATEDELETE 语句时,如果 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类型没有时区信息,而且耗费空间更大,数值型时间戳表示时间不够直观。

7.2、隐式转换造成的索引失效