文章目录
- 前言
- 一、ORM框架
- 二、ACID原则
- 三、事务Transaction
- 四、N+1问题
- 五、Normalization三范式
- 六、FMEA方法论(Failure Mode and Effects Analysis)
- 七、Profiling和PerformanceSchema查询分析
前言
基础理论
ORM框架、ACID原则、事务Transaction、N+1问题、Normalization三范式、FMEA方法论(Failure Mode and Effects Analysis)、Profiling和PerformanceSchema查询分析等
一、ORM框架
ORM全称为对象关系映射(Object-Relational Mapping),是一种将对象模型和关系数据库之间进行映射的技术。
它的主要目的是为了简化开发人员在应用程序中访问数据库的过程,通过将面向对象的语言中的对象和类转化为关系型数据库中的表和行,使得开发人员可以使用面向对象的思维来操作数据库。
- 分类有三种:
- 基于数据查询的ORM:通过将数据库查询结果映射为对象,以实现数据的读取、过滤和转换。
- 基于对象操作的ORM:通过将对象转化为对应的SQL语句,以实现数据的增删改查操作。
- 基于事务的ORM:通过将对象操作组合为一个事务,以确保数据的一致性和完整性。
- 优势:
- 简化数据库操作:ORM工具隐藏了底层数据库的细节,使开发人员可以更加专注于业务逻辑的实现,而不必关心数据库操作的细节。
- 提高开发效率:ORM工具自动生成数据库操作的代码,减少了手动编写SQL语句的工作量,同时还提供了很多常用的操作方法和功能,加快了开发速度。
- 提高代码的可维护性:ORM工具将数据库操作和业务逻辑代码分离,使得代码更加清晰和易于维护。
- 跨数据库的支持:ORM工具可以屏蔽不同数据库之间的差异,开发人员可以在不同的数据库之间切换而无需修改代码。
- 提供缓存和性能优化:ORM工具通常具有缓存机制和性能优化功能,可以提高数据库查询的效率和性能。
- 应用场景:
- Web应用开发:ORM工具可以方便地与前端开发技术(如HTML、CSS、JavaScript)结合,用于开发各种类型的Web应用。
- 移动应用开发:ORM工具可以用于移动应用的后端开发,实现与数据库的交互。
- 数据分析与报表生成:ORM工具可以用于从数据库中提取数据,并进行统计分析和报表生成。
- 企业级应用开发:ORM工具可以与其他企业级框架(如Spring、Hibernate等)结合使用,实现大规模企业应用的开发和管理。
二、ACID原则
ACID 是用来描述数据库事务的属性。反过来说,满足 ACID 属性的一系列数据库操作被称为事务。
- 原子性((Atomicity):
事务是一个不可分割的最小操作单元
,其对数据的修改,要么全都执行,要么全都不执行。意味着 “全有或全无”(All or Nothing)。 - 一致性(Consistency):在事务开始和完成时,数据都必须保持一致状态。意味着数据库总是从一个一致性的状态转换到另外一个一致性的状态。。
- 隔离性(Isolation):
事务通常来说是不可见的
,保证事务在不受外部并发操作影响的独立环境下运行。意味着一个事务所做的修改在最终提交以前,对其他事务是不可见的。 - 持久性((Durability):事务完成之后,它对于数据的修改是永久性的,即使出现系统故障也能够保持。
下图解释了 ACID 在数据库事务中的含义。
对于单个节点
的事务,数据库都是通过并发控制和恢复机制(日志技术)保证事务的ACID特性。
对于跨多个节点
的分布式事务,通过两阶段提交协议(two phase commiting)来保证事务的ACID。
神书 DDIA (Designing Data Intensive Applications) 中关于 ACID 有几点很好的见地,值得我们思考:
- 一致性其实是应用程序的责任,而不是数据库的职责范围。应用程序可以使用原子性和隔离来保证数据的一致性。而数据库系统只能保证各种数据库规则被执行了。
- ACID 四个属性中只有隔离是用来描述并发情况的,原子性并不描述并发情况。
- 各个弱隔离级别都会带来一些限制,我们需要清楚其底层机制。
三、事务Transaction
什么是事务?
事务是一组操作的集合,事务会把所有操作,作为一个整体一起向系统提交或撤销操作请求,即这些操作要么同时成功,要么同时失败。
事务的特性:
数据库事务特性:原子性(Atomic)、一致性(Consistency)、隔离性(Isolation)、持久性(Durabiliy)。简称ACID。
基本操作:
-- 查看事务提交方式
SELECT @@AUTOCOMMIT;
-- 设置事务提交方式,1为自动提交,0为手动提交,该设置只对当前会话有效
SET @@AUTOCOMMIT = 0;
-- 提交事务
COMMIT;
-- 回滚事务
ROLLBACK;
未开启事务:
模拟sql语句错误,此语句出错后张三钱减少但是李四钱没有增加
-- 1. 查询张三账户余额
select * from account where name = '张三';
-- 2. 将张三账户余额-1000
update account set money = money - 1000 where name = '张三';
-- 3. 将李四账户余额+1000
update account set money = money + 1000 where name = '李四';
开启事务:
START TRANSACTION 或 BEGIN TRANSACTION;
-- 设置手动提交后上面代码改为:
start transaction;
select * from account where name = '张三';
update account set money = money - 1000 where name = '张三';
update account set money = money + 1000 where name = '李四';
commit;
开启事务后,只有手动提交才会改变数据库中的数据。
并发事务:
问题 | 描述 |
---|---|
脏读 | 一个事务读到另一个事务还没提交的数据 |
不可重复读 | 一个事务先后读取同一条记录,但两次读取的数据不同(两次读取之间,有其他事务提交了导致) |
幻读 | 一个事务按照条件查询数据时,没有对应的数据行,但是再插入数据时,又发现这行数据已经存在 |
并发事务隔离级别:
隔离级别 | 脏读 | 不可重复读 | 幻读 |
---|---|---|---|
Read uncommitted 读未提交 | √ | √ | √ |
Read committed 读已提交 | × | √ | √ |
Repeatable Read(默认) 可重复读 | × | × | √ |
Serializable 串行化 | × | × | × |
√表示在当前隔离级别下该问题会出现
Serializable 性能最低;Read uncommitted 性能最高,数据安全性最差
查看事务隔离级别:
SELECT @@TRANSACTION_ISOLATION;
设置事务隔离级别:
SET [ SESSION | GLOBAL ] TRANSACTION ISOLATION LEVEL {READ UNCOMMITTED | READ COMMITTED | REPEATABLE READ | SERIALIZABLE };
SESSION 是会话级别,表示只针对当前会话有效,GLOBAL 表示对所有会话有效
拓展:
- 在SQL语句之后加上\G会将结果的表格形式转换成行文本形式
- 查看Mysql数据库占用空间:
SELECT table_schema "Database Name", SUM(data_length + index_length) / (1024 * 1024) "Database Size in MB"
FROM information_schema.TABLES
GROUP BY table_schema;
四、N+1问题
五、Normalization三范式
三范式是具有最小冗余的表结构。具体如下:
- 第一范式(1st NF -列不可再分,原子性)
第一范式的目标是确保每列的原子性,每列都是不可再分的最小数据单元(也称为最小的原子单元)。
2. 第二范式(2nd NF-记录的唯一性约束,主键约束 )
第二范式要求每个表只描述一件事情。满足第一范式,并且表中非主键列不存在对主键的部分依赖。
3. 第三范式(3rd NF- 字段冗余性的约束,外键约束)
第三范式定义是,要求字段无冗余。满足第二范式,并且表中的列不存在对非主键列的传递依赖。
除了主键订单编号外,顾客姓名依赖于非主键顾客编号。