内存数据库
redo log && undo log && bin log
ACID:数据库事务执行的四要素:atomicity原子性,consistency一致性,isolation隔离性,durability持久性。
reference: https://blog.csdn.net/weixin_47786582/article/details/132701284
而事务的原子性、一致性和持久性由事务的 redo 日志和 undo 日志来保证。
REDO LOG 称为 重做日志 ,提供再写入操作,恢复提交事务修改的页操作,用来保证事务的持久性。 UNDO LOG 称为 回滚日志 ,回滚行记录到某个特定版本,用来保证事务的原子性、一致性。
redo log : 是存储引擎层(innodb)生成的日志, 记录的是” 物理级别 “上的页修改操作, 比如页号×××, 偏移量yyy, 写入了’zzz’数据. 主要为了保证数据的可靠性; undo log : 是存储引擎层(innodb)生成的日志, 记录的是 逻辑操作 日志, 比如对某一行数据进行了INSERT语句操作, 那么undo log就记录一条与之相反的delete操作. 主要用于 事务的回滚 (undo log 记录的是每个修改操作的 逆操作 ) 和 一致性非锁定读 (undo log回滚行记录到某种特定的版本– MVCC, 即多版本并发控制)
redo日志
持久性:对于一个已经提交的事务,在事务提交后即使系统发生了崩溃,这个事务对数据库中所做的更改也不能丢失。
- 设计初衷:
1 由于cache/buff的存在,会导致expection,crash时没有及时刷盘或者flush cache,从而导致提交数据丢失。
2 为了保证持久性,那就要及时刷盘/cache
这样会造成flush频繁,IO/Cache flush成为性能瓶颈。
引入Redo日志:InnoDB引擎:WAL Write-Ahead Logging。当发生crash但数据未刷到内存/磁盘文件中,可以通过redo来恢复。
example: 记录哪些东西被修改:事务A将表空间xx页表xx处内容改成xx值。
-
优势
降低刷盘频率
占用空间小
-
特点
redo日志顺序记录,使用顺序IO??????
事务执行过程中不断记录
Mini-Transaction
对底层页表的一次原子访问。
事务-> 语句 -> Mini-Transaction -> redo日志。
Undo日志
原子性和一致性:
原子性:原原子性保证了在一个事务中,多个数据库操作,要么全部成功,要么全部失败,不允许出现部分成功,部分失败的情况。
引入原因:可能发生异常情况,导致事务处理一半:
example1:事务执行过程中可能遇到各种错误,比如 服务器本身的错误 , 操作系统错误 ,甚至是突然 断电 导致的错误。
example2:程序员可以在事务执行过程中手动输入 ROLLBACK 语句结束当前事务的执行。
引入Undo日志,为了回滚而记录的内容。
PS:1、查询操作select不会产生Undo日志 2、Undo日志本身的持久性由Redo日志完成。
功能:
-
回滚数据
-
MVCC
InnoDB存储引擎中MVCC通过Undo日志完成。 当用户读取一行记录,若该记录已经被其他事务占用,当前事务可以通过undo读取之前的行版本信息,以此实现非锁定读取。
Undo日志 -> 回滚段, 回滚段的分类:
1、Uncommitted undo infomation
2、Committed undo infomation 已提交但未过期数据
3、expired undo information 已提交并且过期数据
事务提交后并不能马山删除undo log和对应的页。因为其他事务需要通过undo log来得到行记录之前的版本。提交时放到undo log链表,等待purge线程来回收。
Undo日志分类:
-
insert undo log
insert操作的记录,对事务本身可见,对其他事务不可见 - 事务隔离性。 所以在事务提交后,可以直接删除。不需要等待purge操作。
-
update undo log
delete update操作,MVCC机制,对其他事务可见,所以提交时放到undo log链表,等待purge线程来回收。
数据库设计
reference:https://baijiahao.baidu.com/s?id=1766408092127630197&wfr=spider&for=pc
-
需求分析
应用场景(人员管理、商品管理) 数据类型(数字、字符、日期) 数据量(规划数据容量) 数据访问(访问频率和方式) 数据安全(加密) 系统可用性(可靠性,容灾)
-
概念设计
确定数据模型和实体关系图。
数据模型:实体与属性之间的关系。
实体关系:实体之间的关系, 1N, MN
主键和外键:确定每个实体的主键和外键,以保证数据的完整性和唯一性。
约束条件:实体之间的约束条件 完整性约束,域完整性约束
性能优化:数据分区,索引优化。
-
逻辑设计
数据库表:在逻辑设计中,将实体转化为数据库表,并确定表的结构和属性,确保表的设计符合数据库设计规范,例如第一范式、第二范式、第三范式等。
数据库架构:根据数据管理系统的预计使用情况,设计合适的数据库架构,包括单机版、集群版、分布式版等。
数据库索引:设计合理的数据库索引,提高查询效率和数据访问速度。
数据库存储过程和触发器:设计存储过程和触发器,用于处理复杂的业务逻辑,在数据库层面实现数据处理。
安全性优化:考虑安全性优化,例如加密、权限管理等。
-
物理设计
数据库分区:设计合理的数据库分区方案,提高数据管理系统的容量和性能。
存储优化:设计合理的存储安排,优化数据存储结构,提高存储空间利用率。
备份和恢复:设计合理的备份和恢复方案,保证数据的连续性和完整性。
性能监控:设计合理的性能监控和调优方案,保持数据管理系统的稳定性和高效性。
总之,进行数据库设计需要经过需求分析、概念设计、逻辑设计和物理设计等多个阶段,每个阶段都需要认真思考和设计,确保数据管理系统的高效性、可扩展性、易用性和安全性。同时,还需要根据业务需求进行持续优化和调整,以保证数据管理系统始终处于最佳状态。数据库表:在逻辑设计中,将实体转化为数据库表,并确定表的结构和属性,确保表的设计符合数据库设计规范,例如第一范式、第二范式、第三范式等。
数据库知识: 表、记录、索引、关联关系 -
表
记录
索引
索引跳表
数据库索引和主键、外键的关系??
关联关系
sqlite3
1
2
3
4
5
SQLite is a C-language library that implements a small, fast, self-contained,
high-reliability, full-featured, SQL database engine. SQLite is the most used
database engine in the world. SQLite is built into all mobile phones and most
computers and comes bundled inside countless other applications that people
use every day.It also include lemon and sqlite3_analyzer and tcl tools.
1
SQLite,是一款轻型的数据库,是遵守ACID的关系型数据库管理系统,它包含在一个相对小的C库中。它是D.RichardHipp建立的公有领域项目。它的设计目标是嵌入式的,而且已经在很多嵌入式产品中使用了它,它占用资源非常的低,在嵌入式设备中,可能只需要几百K的内存就够了。它能够支持Windows/Linux/Unix等等主流的操作系统,同时能够跟很多程序语言相结合,比如 Tcl、C#、PHP、Java等,还有ODBC接口,同样比起Mysql、PostgreSQL这两款开源的世界著名数据库管理系统来讲,它的处理速度比他们都快。
PostgreSQL增强