Skip to content

introduction

ACID

Isolation level

mysql> SHOW VARIABLES LIKE 'transaction_isolation';

  • Read committed

    该级别下,所有事务可以获取其他事务未提交数据。

  • Read uncommitted

    该级别下,所有事务只能读取其他事务已提交数据。

  • Repeatable read

    该级别下,所有事务中多次读取到的数据内容一致。(多数数据库系统的默认隔离级别,

  • Serializable

    该级别下,事务顺序执行,之间不存在冲突。

transactions concurrent

  • 脏读

    读取未提交数据。一个事务读取另一个事务未提交的数据。

  • 不可重复读

    多次读取,前后内容不一致。一个事务多次读取同一条数据,中间另一事务发生数据修改造成获取内容不一致。

  • 幻读

    多次读取,数据量不一致。 一个事务两次读取列表中间,另一事务发生数据插入 造成获取列表数量不一致。

Isolation level脏读不可重复读幻读
Read uncommittedxxx
Read committedoxx
Repeatable readoox
Serializableooo

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 uncommittedxxx
Read committedoxx
Repeatable readoox
Serializableooo

设计原则

规范化(Normalization)是数据库设计的一些列原理和技术,主要减少表中数据的冗余,增加完整性和一致性,同时使得数据库易于维护和扩展。

在满足数据存储和拓展的前提下,尽量使用更小的数据类型。这样可以节省一些存储,通常性能也会更好。

尽量避免使用NULL值。NULL 需要更多的存储和额外的处理,尽量使用NOT NULL 加上默认值。

一个字段同时出现在多个表中,我们应该使用相同的数据类型。

  • 第一范式

    原子性,每一列的属性都不可再分割。

  • 第二范式

    一张表仅描述一件事情,每一列的属性都不可再分割,且非主属性完全依赖于主属性。

  • 第三范式

    非主键字段不能推导出其他非主键字段,每一列的属性都不可再分割,且非主属性依赖于主属性,且每个非主属性都不传递函数依赖于主属性。

  • 反范式

    增加冗余字段、增加计算列、将小表合成大表。

SQL GUI

GUI, Graphical User Interface 实质是调用客端指令(mysql client) mysql mysqldump 对数据库进行操作。 参考:MySQL client 系列工具,DBeaver、mysql-Benchmarks、Navicat、VirtDB