Mysql索引、事务、隔离级别、存储结构--详解

一、4大SQL语句分类

二、数据库5大约束分类

三、数据库5种索引分类 

四、数据库(常见的3种)搜索引擎

五、mysql数据库5种存储数据结构

六、ACID事务模型及数据隔离级别

        1.1 Atomicity 原子性

        1.2 Isolation 隔离性

        1.3Durability 持久性

        1.4 Consistency 一致性(最终):


一、4大SQL语句分类

  • DDL: 数据库定义语句( create, drop, alert)
  • DCL: 数据库控制语句( grant, revoke, commit, rollback)
  • DML: 数据库操作语句( update, insert, delete)
  • DQL: 数据库查询语句( select)

二、数据库5大约束分类

  • 非空约束:not null
  • 检查约束:check
  • 外键约束:foreginkey
  • 主键约束:primarykey
  • 唯一约束:unique

三、数据库5种索引分类 B-Tree 索引, Hash 索引, Fulltext 索引 和 R-Tree 索引 (还有 B+Tree)

        索引优点:可以根据查询要求迅速缩小查询范围,避免全表扫描;

1、主键索引
        主键索引不一定是聚簇索引,但通常情况下主键索引就是聚簇索引,也可以是非聚         簇索引或者堆索引,可以和多个字段联合做主键,值不能为null。

 2、单列索引
        一个表中可以有多个单列索引,值可以不为空。

3、唯一索引
        索引列中的值必须唯一,但是可以有null值。

4、复合索引
        复合索引是多个字段上创建的索引,一个索引包含多个列,复合索引的开销比单列 索引开销更小,列入员工编号、员工、姓名可就可以建立复合索引,只有在查询条件中使用了创建索引时的第一个字段,索引才会被使用。

5、全文索引

        主要用于在文本字段上进行全文搜索。它允许你执行复杂的文本搜索操作,如自然语言搜索、布尔搜索和近似搜索。

聚簇索引(同聚集索引)和非聚簇索引(Clustered Index)

         ①聚集索引:聚簇索引是指将表中的数据行按照指定的列(通常是主键)进行排序,它会根据聚集索引的顺序来存储表中的数据,并且一个表中只能有一个聚集索引。比如字典中用拼音来查询汉字;

                 SQL:create clustered index index_name on table_name(column_name);

                  使用场景:①查询结果是以该字段为排序依据的

                                    ②查询结果返回一个区间的值

                                    ③聚集索引会降低Insert和update操作额性能。

         ②非聚集索引:与聚集索引相反 索引顺序和物理存储顺序不一致,例如字典中按部首查询汉 字。

                   SQL:create nonclustered index index_name on table_name(column_name);

                    使用场景:①查询数据量比较少的情况

                                      ②某字段中的数据唯一性比较高的情况下

四、数据库(常见的3种)搜索引擎

  • Innodb引擎:现mysql默认存储引擎,Innodb引擎提供了对数据库ACID事务的支持。并且还提供了行级锁和外键的约束。它的设计的目标就是处理大数据容量的数据库系统。

        存储方式:数据同样存储在磁盘上面(idb文件包含索引和数据),基于B+Tree结构存储,在树 的叶子节点处存储了索引对应的数据,在通过索引进行检索时命中叶子节点 即可从叶子节点中直接读取数据。

  • MyIASM引擎(原本Mysql的默认引擎):不提供事务的支持,支持表锁但不支持行级锁和外键。数据是通过二进制的方式存储在磁盘上(.MYD/.MYI文件),文件中索引和数据是分离存储的;

        存储方式:先从索引文件中找到数据的磁盘位置,再从数据文件中找到索引对应的数据内容。

  • MEMORY引擎:所有的数据都在内存中,数据的处理速度快,但是安全性不高。

五、mysql数据库5种存储数据结构

  • 二叉树: 每个节点最多能支持两个分叉
  • 二叉查找树: 基于二叉树,但是二叉查找树左子树的所有节点都要小于它的根节点,右侧子
    节点都要大于它的根节点
  • AVL平衡二叉树: 由于二叉树可能产生"斜树"的问题,从而导致时间复杂度增加,因此引入
    了平衡二叉树,具有二叉查找树的所有特点,但它的左右两个子树的高度差的绝对值不能超过1,通过左旋和右旋的机制来达到平衡。
  • B-Tree: 是一种多路平衡的二叉树,既满足平衡二叉树的规则,又可以有多个子树,子树的数量取决于关键字的数量(= 根节点中关键字的数量+1)
  • B+Tree和B-Tree的不同点:
    ①B-树的数据存储在每一个节点上, B+树的子树数量等于它的关键字的数量,而B-树是关键字数量+1
    ②而B+树的数据存储在每一个叶子节点上,并且通过链表的方式将所有叶子节点串联起来

平衡二叉树的高度要比B树要高,所以磁盘的IO的磁盘次数也比较多,所以数据存储结构大多数用B树或者B+树做数据存储。

MangoDB中采用B树存储数据,MangoDB中所有的节点都有Data域,无疑单次查询更快些,只要找到指定的索引就能进行访问,

Mysql作为一种关系型数据库,区间访问也是一种常见的情况,而B+树数据存储在叶子节点上并且通过指针串联在一起,这样就容易进行区间遍历或者全部遍历访问

六、ACID事务模型及数据隔离级别

START TRANSACTION;  -- 开启事务

-- 若干SQL操作
UPDATE user SET name = user1' WHERE id = 1; 
INSERT INTO user (id,name) VALUES (1,admin');

COMMIT;	 -- 提交

SET autocommit = 'NO'; -- 自动提交事务

1.1 Atomicity 原子性

        每一个事务中的所有操作都要像原子一样要么全部成功,要么全部失败

UNDO LOG机制:INNODB提供了UNDO LOG机制,记录数据每次的增删改操作,通常一条sql对应一个UNDO LOG,当一组操作出现异常触发回滚,反向执行UndoLog,恢复所有数据执行前状态。

1.2 Isolation 隔离性

        事务执行过程中相互隔离,事物之间不能相互干扰,不能相互查看彼此未提交的数据,分为写与写隔离/写与读隔离,分别通过[锁]/[MVCC]来实现。

常见三大读写问题

  • 脏读:A事务执行过程中读取到了B事务还未提交的数据。
  • 不可重复读:A事务执行过程中对同一条数据进行两次读取,但是两次读取过程中B事务修改并提交了这条数据,导致A事务两次读取数据不一致。
  • 幻读:A事务执行过程中对同一集合数据进行两次读取,但是两次读取过程中B事务在集合中增加或者删除了部分数据,导致A事务两次读取到了数据不一致的行数据。

四种事务隔离级别:

读未提交:允许一个事务取另一个还未提交的事务的数据。这种隔离级别可能会导致"脏读"、"不可重复读"和"幻读"这样的问题。

读已提交:保证了一个事务只能取另一个提交的事务的数据。这种隔离级别可以防止"脏读"问题,但仍然可能出现"不可重复读"和"幻读"问题。

可重复读:保证了一个事务读取结果和别的没提交事务是一样的,查询结果不会变。

串行化:读取需要获取共享读锁,更新需要获取排他写锁,如果SQL使用WHERE语句,还会获取区间锁,这是较高的隔离级别

-- 隔离级别
SHOW VARIABLES LIKE'transaction_isolation';
-- InnoDB默认隔离级别是REPEATABLE-READ可重复读
SET transaction_isolation ='REPEATABLE-READ';

1.3Durability 持久性

        事务一旦提交,事务中的所有更改就不会由外界因素干扰(断电/设备故障)而发生变化。

        REDO LOG机制:数据从内存写入磁盘的同时,数据也会有Redo Log Buffer数据备份。

        双写缓冲区 - 同步恢复机制:数据从内存以16KB大小数据(最小数据页)向硬盘传输刷盘时,操作系统OS以4KB大小数据记性传输,所以也有可能导致数据未完整传输。

1.4 Consistency 一致性(最终)

        由数据原子性、隔离性、持久性共同保证数据一致性。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值