💠

💠 2024-11-20 10:28:22


数据库

码农翻身:爱炫耀的数据库老头儿 事务,undo日志

DB-Engines Ranking 数据库评分排行
墨天轮数据库社区

事务

ACID

  1. 原子性(Atomicity)
    • 事务开始后所有操作,要么全部做完,要么全部不做,不可能停滞在中间环节。
    • 事务执行过程中出错,会回滚到事务开始前的状态,所有的操作就像没有发生一样。也就是说事务是一个不可分割的整体,就像化学中学过的原子,是物质构成的基本单位。
  2. 一致性(Consistency)
    • 事务开始前和结束后,数据库的完整性约束没有被破坏 。比如A向B转账,不可能A扣了钱,B却没收到。
  3. 隔离性(Isolation)
    • 同一时间,只允许一个事务请求同一数据,不同的事务之间彼此没有任何干扰。比如A正在从一张银行卡中取钱,在A取钱的过程结束前,B不能向这张卡转账。
  4. 持久性(Durability)
    • 事务完成后,事务对数据库的所有更新将被保存到数据库,不能回滚。

事务的并发问题

  1. 脏读
    • 事务A读取了事务B更新的数据,然后B回滚操作,那么A读取到的数据是脏数据
  2. 不可重复读
    • 事务 A 多次读取同一数据,事务 B 在事务A多次读取的过程中,对数据作了更新并提交,导致事务A多次读取同一数据时,结果 不一致。
  3. 幻读
    • 系统管理员A将数据库中所有学生的成绩从具体分数值改为ABCDE等级,但是系统管理员B就在这个时候插入了一条具体分数的记录
    • 当系统管理员A改结束后发现还有一条记录没有改过来,就好像发生了幻觉一样,这就叫幻读。

小结:不可重复读的和幻读很容易混淆,不可重复读侧重于修改,幻读侧重于新增或删除。解决不可重复读的问题只需锁住满足条件的行,解决幻读需要锁表

Algorithm for Recovery and Isolation Exploiting Semantics (ARIES) 事务隔离和恢复算法


数据库并发控制

MySQL: MVCC

SQL 解析和审计

Slow SQL

Getting Help With A Slow Query

基于代价的慢查询优化建议


关系型数据库设计

范式

范式越高意味着数据冗余更低,表的划分更细,但是在查询数据时需要做大量表连接操作,会严重降低性能

  1. 《数据库系统概论》

1NF

确保每列原子性

数据库表中的所有字段值都是不可分解的原子值

2NF

在1NF基础上,确保表中的每列都和主键相关,即在一个表中的字段都是仅构成一个实体,不可以把别的实体的字段放进来,会导致插入 删除 修改都很复杂

若 R∈1NF 且每一个非主属性完全函数依赖于任何一个候选码 则 R∈2NF

所谓完全依赖是指不能存在仅依赖主关键字一部分的属性,如果存在,那么这个属性和主关键字的这一部分应该分离出来形成一个新的实体,新实体与原实体之间是一对多的关系。为实现区分通常需要为表加上一个列,以存储各个实例的唯一标识。

3NF

在2NF基础上,任何非主属性不依赖于其它非主属性(在2NF基础上消除传递依赖), 即引入外键

  1. 例如 学生成绩表 应该只存学号 课程id 成绩,不应存放学生信息,课程信息,能大大减少数据的冗余
    • 但是实际上为了系统的性能会做部分数据的冗余,例如改动较少的性别姓名等

BCNF

Boyce-Codd Normal Form(巴斯-科德范式)

在3NF基础上,任何非主属性不能对主键子集依赖(在3NF基础上消除对主码子集的依赖)

4NF

基本表的设计

  1. 应尽量避免 字段默认值和业务值发生重叠, 便于后期排查问题,减少一个值的含义
  2. 字段应尽量紧凑,达到业务要求的最小设计,利于索引和IO

关于主键的设计

为了不让数据库成为瓶颈,基本表中连主键的约束都不要了, 全部由后台的代码进行约束处理

  • 如果使用的需要高并发,数据库经常迁移,拆分,分布式,使用UUID,GUID,雪花算法等。
  • 如果是小型项目,使用整型自增即可,排序方便节约内存

视图的设计


关系型和非关系型

为什么说SQL正在击败NoSQL,这对数据的未来意味着什么?

关系型,KV型,文档型,图数据库,多模数据库(混合各数据格式)


关系型数据库

代表性: Oracle, MySQL, PostgreSQL, SQL Server

List of Relational Database Management Systems (RDBMSs)

learndb-py

MySQL
PolorDB
Oracle
PostgreSQL


非关系型数据库

key-value 数据库: redis memcached
文档数据库: MongoDB
图数据库: Neo4j tugraph-db JanusGraph PG扩展
时序数据库: InfluxDB TSDB

  • sssdb 键值对数据库

Redis

Redis数据类型丰富,单线程纯内存高性能, 且久经考验很稳定

  • Github Tendis兼容Redis访问协议,腾讯开源的存储版,已不维护,商业还有缓存版和混合版
  • Dragonfly 兼容Redis和Memcached的 API,高吞吐量
    • 无共享式架构和VLL的选择,不使用互斥锁或自旋锁的情况下组合原子的多键操作
    • docker run –network=host –ulimit memlock=-1 docker.dragonflydb.io/dragonflydb/dragonfly
    • 虽然宣称更高吞吐量,但是拿实际应用场景做测试对比发现Redis比Dragonfly消耗资源少且更快
      • 场景为统计字符频率,只高频执行 ZIncrBy 命令(累计执行了337849次,Redis7.0.5 稳定耗时13s 单核30% Dragonfly 6.2.11稳定耗时19s 等效于单核60%CPU)
  • KeyDB Redis 的一个高性能分支,专注于多线程、内存效率和高吞吐量

RedisGraph/RedisGraphEOL

RocksDB

RocksDBFaceBook开源

LevelDB

Github

LedisDB 基于LevelDB构建Redis协议的数据库实例

MangoDB

MongoDB 文档性数据库, 混合类型: 关系型非关系型

GemFire

分布式内存数据库 12306 采用的解决方案


嵌入型数据库

Github: embedded-database

SQLite

Official Site

  1. 客户端 sqlitebrowser

常见后缀

  • .db 数据文件
  • .db-wal 是写时日志WAL
  • .db-shm 共享内存文件,只包含临时数据。

duckdb

duckdb in-process SQL OLAP Database Management System

可基于CSV,JSON,HDFS文件直接建表做数据分析 CSV Import 支持 webassembly 可在浏览器直接运行


大数据

Hive Hbase Impala Presto Doris Kylin

Clickhouse

Greenplum
TiDB
Ignite


向量数据库

向量数据库|一文全面了解向量数据库的基本概念、原理、算法、选型

图数据库

Note: 图数据库

时序数据库

DB-Engines Ranking - popularity ranking of time Series DBMS


数据库中间件

MyCat:开源分布式数据库中间件

图形化工具