本文已参与「新人创作礼」活动,一起开启掘金创作之路。
目录
1.数据库事务讲解:
数据库事务是访问并可能操作各种数据项的一个数据库操作序列,这些操作要么全部执行,要么全部不执行,是一个不可分割的工作单位。事务由事务开始与事务结束之间执行的全部数据库操作组成。
通俗的说:事务就是 一组SQL语句(程序执行单元)在操作的过程当中, 要么同时成功, 要么同时失败。
事务的操作:
1. 开启事务, SQL 语法:
START TRANSACTION;2. 回滚事务, SQL 语法:
ROLLBACK;3. 提交事务
COMMIT;事务提交方式分类:
自动提交 (MySQL 默认的提交方式)
手动提交 (Oracle 采用的提交方式)相关SQL语法
-- 查看事务的提交方式, 说明: 1表示自动提交, 0表示手动提交
SELECT @@AUTOCOMMIT;
-- 修改事务的提交方式, 标准语法
SELECT @@AUTOCOMMIT = 数字;
特性和级别
1. 四大特性(感兴趣的可以看下原子性和一致性有什么区别)
原子性:不可分割,事务作为一个整体被执行,包含在其中的对数据库的操作要么全部被执行,要么都不执行。
一致性:事务应确保数据库的状态从一个一致状态转变为另一个一致状态。数据库中的数据应满足完整性约束。
隔离性:多个事务并发执行时,一个事务的执行不应影响其他事务的执行。
持久性:已被提交的事务对数据库的修改应该永久保存在数据库中。
2. 四种级别
A. 读未提交 READ UNCOMMITTED
B. 读已提交 READ COMMITED
C. 可重复读 REPEATABLE READ
D. 串行化 SERIALIZABLE
| 序号 | 隔离级别 | 名称 | 脏读 | 不可重复读 | 幻读 | 数据库默认隔离级别 |
|---|---|---|---|---|---|---|
| 1 | READ UNCOMMITTED | 读未提交 | YES | YES | YES | |
| 2 | READ COMMITTED | 读已提交 | NO | YES | YES | Oracle 数据库默认级别 |
| 3 | REPEATABLE READ | 可重复读 | NO | NO | YES | MySQL 数据库默认级别 |
| 4 | SERIALIZABLE | 串行化 | NO | NO | NO |
| 问题说明 | 现象说明 |
|---|---|
| 脏读 | 在事务A 处理的过程当中,读取到了另外一个事务 B,还没有提交的数据, 导致两次查询结果,不一致 |
| 不可重复读 | 在事务 A 处理的过程当中,读取到了另外一个事务 B,修改并且已经提交的数据,导致两次查询结果,不一致 |
| 幻读 | 现象1: SELECT 查询某条记录是否存在,不存在,准备插入记录,但是执行 INSERT 的时候,发现记录已经存在,无法插入。现象2: SELECT 查询某条记录是否存在,不存在,去执行 DELETE 删除操作的时候,发现删除成功了。 |
2.存储引擎的介绍
MySQL 当中常用的存储引擎:
1. InnoDB : 支持事务,支持并发控制,占用磁盘空间大,MySQL5.5版本之后, 默认的存储引擎
2. MyISAM : 不支持事务和外键
3. Memory : 内存存储,速度快,最不安全(比如断电)。小量快速访问的数据
3.索引的分类
1. 按照功能分类
A. 普通索引: 最基本的索引,他没有任何的限制
B. 唯一索引: 索引列的值必须唯一, 但是允许有空值的情况, 如果是组合索引, 则列值组合必须唯一
C. 主键索引: 一种特殊的唯一索引, 不允许有空值, 一般在建表时, 同时创建主键索引
D. 组合索引: 就是将单列索引进行组合
E. 外键索引: 只有 InnoDB 引擎支持外键索引, 用来保证数据的一致性、完整性和实现级联操作
F. 全文索引: 快速匹配全部文档的方式。InnoDB 引擎 5.6 版本后, 才能支持全文索引, MEMORY 引擎不支持
2. 按照结构分类
A. B+Tree 索引: MySQL 使用最频繁的一个索引数据结构, 是InnoDB和MyISAM 存储引擎默认的索引类型
B. Hash 索引: MySQL 中的 Memory 存储引擎默认支持的索引类型
创建索引
-- 1. 创建索引的语法: CREATE [UNIQUE][FULLTEXT] INDEX 索引名称 [USING 索引类型] ON 表名称(列名称....); -- 2. 案例代码: -- 为 student 表当中的 name 列创建一个普通的索引。 CREATE INDEX idx_name ON student(name); -- 为 student 表当中的 age 列创建一个唯一索引。 CREATE UNIQUE INDEX idx_age ON student(age);查看索引
-- 1. 查看索引的语法: SHOW INDEX FROM 表名称; -- 2. 案例代码: 查询学生表当中,拥有的索引 SHOW INDEX FROM student;添加索引
-- 1. 普通索引 ALTER TABLE 表名称 ADD INDEX 索引名称 (列名); -- 2. 组合索引 ALTER TABLE 表名称 ADD INDEX 索引名称 (列名1,列名2,列名3....); -- 3. 主键索引 ALTER TABLE 表名称 ADD PRIMARY KEY (主键列名称); -- 4. 外键索引 ALTER TABLE 表名称 ADD CONSTRAINT 外键名称 FOREIGN KEY (本表外键列名) REFERENCES 主表名称(主键列名); -- 5. 唯一索引 ALTER TABLE 表名称 ADD UNIQUE 索引名称(列名); -- 6. 全文索引 ALTER TABLE 表名称 ADD FULLTEXT 索引名称(列名);删除索引
-- 1. 基础语法 DROP INDEX 索引名称 ON 表名称;
4.索引的原理
磁盘存储,BTree及B+Tree:
磁盘存储:先找到磁盘块进行全量读取。
1. 将多条数据,进行分组管理,每一组的大小设定为 16KB。
2. 先查找数据所在的组, 再查找组当中的数据。BTree(节点上有索引和数据) 读写效率低,了解即可,相关磁盘都要全量读取,效率低
B+Tree(节点无数据,数据在叶子节点上)
1. 查询效率高. 普通节点上,不会保存 数据值,只需要找到 普通节点的 索引。 根据左边大,右边小的原则, 找到叶子节点就行。
2. 如果是 BTree 普通节点上, 会保存 数据值, 每次找到普通节点的同时, 还需要去获取节点当中的数据值。
3. 获取普通节点的数据值, 需要花费时间,降低效率。
5.数据库锁机制
数据库为了保证数据的一致性, 当出现各种共享资源, 在被并发访问的时候, 保证有序设计的一种规则。
锁的分类:
1. 操作方式分类
A. 共享锁: 也叫作 读锁。 操作同一份数据,可以查询DQL,但是不能增删改DML。
InnoDB引擎默认加的是行锁
InnoDB引擎如果不采用带索引的列加锁,加的就是表锁
B. 排他锁: 也叫作 写锁。 当前的操作,没有完成的情况下,会阻断其他 增删改查 操作。2. 粒度大小分类
A. 表级锁:
a. 规则: 操作数据的时候,锁住整张表
b. 特点: 开销小,加锁快,冲突高
c. 代表: MyISAM 存储引擎
B. 行级锁:
a. 规则: 操作数据的时候,锁住当前操作行
b. 特点: 开销大,加锁慢,冲突低
c. 代表: InnoDB 存储引擎3. 使用方式分类
A. 悲观锁: 每次查询,都会判定数据变化, 很悲观, 所以查询时候会加锁
B. 乐观锁: 每次查询,都会判断数据不会发生变化, 很乐观, 需要手动加锁
不同的存储引擎,支持不同的锁 (常见的几种存储引擎当中,只有 InnoDB支持 行级锁)
| 存储引擎 | 表级锁 | 行级锁 |
|---|---|---|
InnoDB | 支持 | 支持 |
MyISAM | 支持 | 不支持 |
MEMORY | 支持 | 不支持 |
BDB | 支持 | 不支持 |