introduction
ACID
Isolation level
mysql> SHOW VARIABLES LIKE 'transaction_isolation';
Read committed
该级别下,所有事务可以获取其他事务未提交数据。
Read uncommitted
该级别下,所有事务只能读取其他事务已提交数据。
Repeatable read
该级别下,所有事务中多次读取到的数据内容一致。(多数数据库系统的默认隔离级别,
Serializable
该级别下,事务顺序执行,之间不存在冲突。
transactions concurrent
脏读
读取未提交数据。一个事务读取另一个事务未提交的数据。
不可重复读
多次读取,前后内容不一致。一个事务多次读取同一条数据,中间另一事务发生数据修改造成获取内容不一致。
幻读
多次读取,数据量不一致。 一个事务两次读取列表中间,另一事务发生数据插入 造成获取列表数量不一致。
Isolation level | 脏读 | 不可重复读 | 幻读 |
---|---|---|---|
Read uncommitted | x | x | x |
Read committed | o | x | x |
Repeatable read | o | o | x |
Serializable | o | o | o |
Database Object
磁盘规划
- tablespace 表空间
- schema 模式
- database 数据库
注:不同 RDMS 该部分设计不同;MySQL、MariaDB 中的 schema 等同 database。即,只有 tablespace 和 database 两个对象。
结构规划
- table 表
- view 视图
- index 索引
- constraint 约束
- sequnce 序列
- comment 注释
function & hooks
- stored procedure 存储过程
- trigger 触发器
- function 函数
用户权限
- user 用户
- role 角色
Atomicity 原子性
事务作为一个整体执行,其中的操作要么全部完成,要么全部不完成。这意味着事务在执行过程中,如果发生错误或者因为某些原因需要中断,那么已经执行的操作必须被撤销,数据库必须回到事务开始之前的状态。
Consistency 一致性
事务必须使数据库从一个一致性状态变换到另一个一致性状态。这意味着事务的开始和结束时,数据库的完整性约束没有被破坏。也就是说,事务的执行不能破坏数据库中数据的语义逻辑。如果事务执行的结果使得数据库的数据处于不一致的状态,那么该事务就被认为是失败的。
Isolation 隔离性
事务并发执行时,一个事务的执行不应影响其他事务。在事务执行过程中,事务对数据的修改在最终提交之前,对其他事务是不可见的。这种隔离性确保了多个事务并发执行时,不会出现数据混乱的情况。数据库管理系统通过锁机制、时间戳等技术手段来实现事务的隔离性。
Durability 持久性
一旦事务提交,其所做的修改就会永久保存到数据库中。即使系统崩溃或者发生其他故障,已经提交的事务的修改也不会丢失。为了实现持久性,数据库管理系统通常会将事务的修改先写入到日志文件中,并在合适的时候将修改应用到实际的数据文件中。这种机制确保了即使在系 统崩溃的情况下,也可以通过日志文件(MySQL 中为 binlog)来恢复数据。
Binlog,即二进制日志(Binary Log),是MySQL数据库中的一种日志文件,用来记录数据库的所有修改操作,如INSERT、UPDATE、DELETE等语句,但不包括SELECT和SHOW这类的语句。Binlog文件主要用于复制和恢复数据,以及在某些情况下用于审计。
Isolation level | 脏读 | 不可重复读 | 幻读 |
---|---|---|---|
Read uncommitted | x | x | x |
Read committed | o | x | x |
Repeatable read | o | o | x |
Serializable | o | o | o |
设计原则
规范化(Normalization)是数据库设计的一些列原理和技术,主要减少表中数据的冗余,增加完整性和一致性,同时使得数据库易于维护和扩展。
在满足数据存储和拓展的前提下,尽量使用更小的数据类型。这样可以节省一些存储,通常性能也会更好。
尽量避免使用NULL值。NULL 需要更多的存储和额外的处理,尽量使用NOT NULL 加上默认值。
一个字段同时出现在多个表中,我们应该使用相同的数据类型。
第一范式
原子性,每一列的属性都不可再分割。
第二范式
一张表仅描述一件事情,每一列的属性都不可再分割,且非主属性完全依赖于主属性。
第三范式
非主键字段不能推导出其他非主键字段,每一列的属性都不可再分割,且非主属性依赖于主属性,且每个非主属性都不传递函数依赖于主属性。
反范式
增加冗余字段、增加计算列、将小表合成大表。
SQL GUI
GUI, Graphical User Interface 实质是调用客端指令(mysql client) mysql
mysqldump
对数据库进行操作。 参考:MySQL client 系列工具,DBeaver、mysql-Benchmarks、Navicat、VirtDB