Mysql的索引与事务理解

发布于:2024-04-28 ⋅ 阅读:(24) ⋅ 点赞:(0)

目录

一、Mysql索引

1、索引的概念

2、索引的特点

3、索引使用场景

4、Mysql有关索引的操作

(1)查询表具有的索引

(2)增加索引

(3)删除索引

5、索引实现原理

(1)B树

(2)B+树

(3)数据库选择B+树的原因

二、Mysql事务

1、事务的概念

2、事务的特点

3、事务的隔离等级

4、数据库操作事务

一、Mysql索引

1、索引的概念

索引是通过额外的数据结构,针对表里的数据进行重新组织,加快查询速度。

2、索引的特点

(1)加快查询的速度;

(2)索引自身也是一种数据结构,会占据存储空间;

(3)当对表进行增、删、改时,对应的索引也要进行修改。

3、索引使用场景

索引适用于表查询的频率高,但是增删改的频率低。

4、Mysql有关索引的操作

先创建一个学生表:

(1)查询表具有的索引

命令:show index from 表名

Mysql中的primary key、unique、foreign key都会默认自动生成索引。

一个表可以有多个索引,索引都是根据具体的列展开的。类似于新华字典中的拼音查询和部首查询

(2)增加索引

命令:create index 索引名称 on 表名(对应索引列)

需注意:如果表中数据较多时,创建索引要慎重,创建时会扫描整个表的数据,涉及大量的读取和写入操作,导致大量的硬盘IO,数据库极容易挂。

ps:如果表中已有数据,但想加入索引的话,可以重新建立一个相同的表,对应列加上索引,然后将表中数据复制到新表中。

(3)删除索引

命令:drop index 索引名称 on 表名

5、索引实现原理

索引是如何做到对应列名快速找到相应数据的???

数据库索引采用的数据结构是B+树,它的前身是B树。

(1)B树

①概念

B树是一个n叉搜索树,与二叉搜索树的区别在于:二叉搜索树一个节点只有一个值,划分出了2个区间;而n叉搜索树,一个节点包含n个值,划分出了n+1个区间。若两棵树高度相同,n叉搜索树的元素更多。

例如:

②特点

数据的索引值和具体data都在每个节点上;任何一个关键字只会出现在一个节点中;每遍历一个节点,就需要进行一次硬盘IO;搜索可能会在非叶子节点结束,搜索次数具有不确定性。

(2)B+树

①概念

B+树是在B树上做了改进,B树上一个节点有n个值,会划分出n+1个区间;对于B+树,一个节点有n个值,会划分出n个区间。

②特点

每个节点的n个值中,存在一个最大值来自父节点;每个节点的值,都会在子树中重复出现;所有值最终都会出现在叶子节点,叶子节点之间使用链式结构相连;查询时间是稳定的,都需要从根结点查询到叶子结点,非叶子节点存储索引值即可,叶子节点存储索引值+数据。减少了硬盘IO次数,对于非叶子节点数据可以存储到内存中,在内存中比较即可。

(3)数据库选择B+树的原因

B+树的查询时间是稳定的,都需要从根结点到叶子结点,经过的硬盘IO次数是一样的;而B树查询时间不稳定,经过的硬盘IO次数也不一定,具有不确定性。

二、Mysql事务

1、事务的概念

对表执行的一批操作(多个操作),在同一个事务当中,这些操作要么全部成功,要么全部失败,不存在部分成功的情况。

2、事务的特点

(1)原子性

通过事务,把多个操作打包到一起,这些操作要么全部成功要么全部失败。

(2)一致性

一个事务必须使数据库从一个一致性状态(数据处于一种有意义的状态)转换到另一个一致性状态。

(3)隔离性

多个事务并发执行时,事务与事务之间应该要不受干扰。

(4)持久性

一个事务一旦提交,对数据库中数据的改变是永久性的,数据会持久化到硬盘。

3、事务的隔离等级

(1)读未提交---读写都未加锁

问题:事务1修改了某个数据,但是没有提交事务1;此时事务2读取到了同一个数据,此时事务2读到的数据是脏数据,还未修改成功(脏读+不可重复读+幻读)。

(2)读已提交---写操作加锁(写的时候不能读)

问题:事务1修改了某个数据,且提交了改事务;此时事务2读取到了正确事务;事务3也修改了某个数据,此时事务2再次读取时发现两次读到的数据内容不一样(不可重复读+幻读)。

(3)可重复读---读和写都加锁(数据库默认隔离等级)

问题:事务1修改了某个数据,且提交了改事务;此时事务2读取到了正确事务;事务3也插入了某个数据,此时事务2再次读取时发现两次读到的数据记录数不一样(幻读)。

(4)串行化

问题:数据最靠谱,但并行程度最低,效率最低。

4、数据库操作事务

(1)开启事务

命令: start transaction

(2)提交事务

命令:commit

(3)回滚事务

命令:rollback

提交后,数据库有插入的新数据。

回滚后,数据库没有插入的新数据。


网站公告

今日签到

点亮在社区的每一天
去签到