数据库详细解读(数据库的事务,存储引擎,索引和锁)

169 阅读7分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

目录

1.数据库事务讲解:

特性和级别

2.存储引擎的介绍

3.索引的分类

4.索引的原理

5.数据库锁机制

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

序号隔离级别名称脏读不可重复读幻读数据库默认隔离级别
1READ UNCOMMITTED读未提交YESYESYES
2READ COMMITTED读已提交NOYESYESOracle 数据库默认级别
3REPEATABLE READ可重复读NONOYESMySQL 数据库默认级别
4SERIALIZABLE串行化NONONO
问题说明现象说明
脏读在事务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 使用最频繁的一个索引数据结构, 是InnoDBMyISAM 存储引擎默认的索引类型
    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支持不支持