数据库(事务ACID、索引、三大范式、MVCC、JOIN)

1.事务

1.1基础概念

数据库事务是由一系列数据库操作(一个或多个操作)组成的程序执行单元。

典型的数据库事务:

BEGIN TRANSACTION //事务开始
SQL1 //操作1
SQL2 //操作2
COMMIT/ROLLBACK //事务提交或回滚

1.2事务四特性(ACID)

(1)原子性(A):事务所有操作不可分割,要么全部成功,要么全部失败回滚。
(2)一致性(C):事务操作使数据库从一个一致的状态变换到另一个一致状态。
(3)隔离性 (I):并发执行的事务操作数据库时,互不影响,相互隔离的。
(4)持久性(D):事务一旦提交,对数据库的更新是永久的。

1.3事务的隔离级别
1.3.1 事务并发三个问题

(1)脏读:事务A读取事务B更新的数据,然后B回滚操作,A读取到的是脏数据;
(2)不可重复读:事务 A 多次读取同一数据,事务 B 在事务A读取的过程中,对数据作了更新并提交,导致事务A多次读取同一数据时,结果不一致;
(3)幻读:系统管理员A更改数据库中学生成绩分数为ABCDE等级,但管理员B在这时仍然插入一条分数的记录,A更改结束后发现还有一条记录没有改过来,就好像发生了幻觉一样,这就叫幻读(某一事务更改的时候其他事务也操作了,更改事务对新操作的数据不起作用)。

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


1.3.2 事务隔离级别

(1)读取未提交:一个事务可以读取另一个未提交事务的数据。产生问题:脏读。
(2)读取提交:只有一个事务提交以后,其他事务才能读取。可避免脏读。
(3)可重复读:事务一旦读取后不可再修改。避免不可重复读问题。
(4)可串行化:可以避免脏读、不可重复读与幻读所有问题,但效率低下,不用。

2.数据库索引

索引是用来存储列值的数据结构。索引是一种数据结构 ,真正存放的是指向表中某一行的指针(地址)。
创建索引的SQL如下:
CREATE INDEX 索引名ON 表名 (字段名)

创建两个列的联合索引,SQL如下:

CREATE INDEX 索引名 ON 表名(字段名1, 字段名2)

数据库索引可以提升数据检索效率,索引中常用的三种数据结构:

(1)B树索引:是最常用的用于索引的数据结构。查找、删除、插入操作的时间复杂度低, 存储在B-Tree中的数据是有序的。
数据库(事务ACID、索引、三大范式、MVCC、JOIN)_第1张图片

(2)B+树索引:是传统意义上的索引,最为常用最为有效的索引。B+树只有叶节点存放数据,其余节点用来索引,而B-树是每个索引节点都会有Data域。
数据库(事务ACID、索引、三大范式、MVCC、JOIN)_第2张图片
在数据库中,B+树的高度一般都是2-4层。
以上为一个3层的B+ Tree,可以使用如下SQL语句进行查询:
  SELECT * FROM STUDENTS WHERE ID=1
   这个查询语句只需要三次查找就可以找到ID为1的叶子节点,找到存放该条记录(存放了ID为1的学生的所有属性)的物理地址,进而找到该条数据。

(3)哈希索引:主要用于比较字符串是否相等查询,能极快的检索出值。哈希将列的值是索引的键值(key),实际值(value)是指向该表中位置的指针。哈希表只适合查询键值对-也就是说查询相等字符(例:like “WHERE name = ‘Jesus’)。
like “WHERE name = ‘Jesus’

(4)R树索引:通常用来解决空间问题。如,要求“查询出所有距离我两公里之内的星巴克”,这种情况下使用R- Tree索引,查询的效率将会提高。 每个树结点下面又有很多结点。
因此,通过建立索引可以对数据库进行查询优化,避免了全表扫描。

3.数据库三大范式
范式:数据库的一些规范来优化数据数据存储方式。

第一范式(1NF):数据表中的属性(每一列、每个字段)不能再分解为更基本的数据单元,称满足数据库设计的第一范式——原子性(属性不可分割)
第二范式(2NF):数据表中的每个实例必须可被唯一区分。通常为表加上一个列,以存储各个实例的唯一标识——主键。
第三范式(3NF):数据库表中不包含已在其它表包含的非主键信息——多张表关联


第 一范式和第二范式规范有没有分出两张表,
第二范式是说一张表中包含了多种不同的实体属性,那么要必须分成多张表,
第三范式是要求已经分成了多张表,那么一张表中只能有另一张表中的id(主键),而不能有其他的任何信息(其他的信息一律用主键在另一表查询)。
总结:
第1范式:每个表中都有1列,并且该列是不可拆分的最小单元
第2范式:1张表只描述一件事情,多件事用多张表
第3范式:多张表时用外键(主键)做表的关联

4.MySQL 存储引擎(2种)
不同的存储引擎提供不同存储机制、索引等功能,使用不同的存储引擎,还可以获得特定的功能。MySQL常用到的是InnoDB和MyISAM两种存储引擎。

(1)InnoDB
InnoDB 默认支持事务(最重要,使用最广泛),采用 “聚集索引” 的数据存储方式实现B树索引,聚集是指数据行和相邻的键值紧凑地存储在一起。
InnoDB 支持自动增长列,支持外键约束。
缺点是:存储空间会占用比较大。

(2)MyISAM
MyISAM不支持事务,采用索引与数据分离的形式,如果数据表只用来插入和查询,则MyISAM引擎能提供较高的处理效率。MyISAM支持全文索引(全部索引)。

InnoDB与MyISAM区别:

(a).InnoDB支持事务,MyISAM不支持,多条SQL语言组成一个事务;
(b).InnoDB是聚集索引,数据和文件和索引绑在一起的,通过主键索引效率很高。MyISAM是非聚集索引,数据文件是分离的,索引保存的是数据文件的指针。
©.InnoDB执行select count(*) from table时需要全表扫描。而MyISAM用一个变量保存表的行数,执行上述语句时只需要读出该变量即可,速度快;
(d).Innodb不支持全文索引,MyISAM支持全文索引,查询效率上MyISAM要高;
如何选择
(a).支持事务,选择InnoDB,不需要事务考虑MyISAM;
(b).如果表中大多数只是读查询,可以考虑MyISAM
©.系统奔溃后,MyISAM恢复起来更困难,InnoDB支持日志恢复;

5.MVCC
MVCC:多版本并发控制,用于实现读取已提交和可重复读两种隔离级别;通过保存数据在某个时间点的快照来实现。

InnoDB的MVCC是通过在每行记录后面保存两个隐藏列来实现,这两个列分别保存该行的创建时间和删除时间。这里存储的并不是实际的时间值,而是系统版本号(可以理解为事务的ID)。

6.数据库索引为什么用B+树而不用B-树?

优点一: B+树只有叶节点存放数据,其余节点用来索引;而B-树是每个索引节点都会有Data域。
优点二: B+树所有的Data域在叶子节点,并且所有叶子节点之间都有一个链指针。

7.B+树做索引而不用红黑树?

二叉查找树(AVL)和红黑树基本都是存储在内存中才会使用的数据结构。
在大规模数据数据存储的时候,由于红黑树的深度过大造成磁盘IO读写频繁,会导致效率低下的情况。

8.画出一颗B+树?
B+树的特征:

1.每个元素只用来索引,不保存数据,所有数据都存在叶子节点。
2.所有的叶子结点包含全部元素信息,叶结点都带有指向下一节点指针,形成有序链表。
3.所有的中间节点元素在子节点都有体现,是子节点最大值。

B+树的优势:

1.单一节点存储更多元素,使得查询IO次数更少。
2.所有查询都要查找到叶子节点,查询性能稳定。
3.所有叶子节点形成有序链表,便于范围查询。

9.SQL中连接(JOIN)的用法
join 是从多个数据表中查询读取数据。按照功能可分为三类:
INNER JOIN(内连接或等值连接)、LEFT JOIN(左连接)、RIGHT JOIN(右连接)
举例:新建的两张student、test_sit 表如下:
数据库(事务ACID、索引、三大范式、MVCC、JOIN)_第3张图片
(1)INNER JOIN(内连接或等值连接)
获取两个表中字段匹配关系的记录.
SELECT 表A和B的字段 FROM 表A INNER JOIN 表B ON A.=B.
SELECT a.id,a.std_name,a.age,b.sit_number,b.id FROM student a INNER JOIN test_sit b ON a.id=b.id;
数据库(事务ACID、索引、三大范式、MVCC、JOIN)_第4张图片

(2)LEFT JOIN(左连接)
获取左表所有记录,即使右表没有对应匹配的记录;
SELECT 表A和B的字段 FROM 表A LEFT JOIN 表B ON A.=B.

SELECT a.id,a.std_name,a.age,b.sit_number,b.id FROM student a 
LEFT JOIN test_sit b ON a.id=b.id;

数据库(事务ACID、索引、三大范式、MVCC、JOIN)_第5张图片

(3)RIGHT JOIN(右连接)
与 LEFT JOIN 相反,用于获取右表中的所有记录。
SELECT 表A和B的字段 FROM 表A RIGHT JOIN 表B ON A.=B.

SELECT a.id,a.std_name,a.age,b.sit_number,b.id FROM student a 
RIGHT JOIN test_sit b ON a.id=b.id;

数据库(事务ACID、索引、三大范式、MVCC、JOIN)_第6张图片

你可能感兴趣的:(数据库)