数据库索引以及事务的相关知识

1.索引

目的:为了提高查找的速度(但是索引拖慢了增删改的速度)
本质上就是把数据库中的记录按照一点的规则/数据结构给组织起来。

1.1使用场景

(1)数据量较大,且经常对这些列进行条件查询。
(2)该数据库的插入操作,及对这些列的修改频率较低。
(3)索引会占用额外的磁盘空间。

1.2索引相关语句

查看索引:show index from 表名;
创建索引:create index 索引名 on 表名(字段名);
删除索引:drop index 索引名 on 表名;

1.3索引内部的数据结构

B+树(N叉搜索树)
【注:只有B+树和B-树(B树),没有B减树】
以下图为例:
在这里插入图片描述
1.父节点里面的值,会作为子节点的最大值出现(也可以是最小值)这样的目的就是让所有叶子节点就包含了整体数据的全集。
2.叶子节点按照顺序通过链表的方式连接了起来,高效实现范围查找。
3.每一行数据的其他列信息,只存在于叶子节点上,非叶子节点仅仅包含索引列的数据。非叶子节点占有的空间就比较小了,可以把这部分内容直接放到内存中,后续查找就可以主要去读内存,减少很多次磁盘操作。

1.4面试题:为什么不用线性表,二叉搜索树,哈希表?

答:线性表效率比较低;二叉搜索树(AVL,红黑树)高度相比较B+树来说高,不合适;哈希表只能进行值相等的查找,不太方便进行值比较大小的范围查找。

2.事务

2.1什么是事务?

数据库事务是指作为单个逻辑工作单元执行的一系列操作,要么全执行,要么全不执行。

2.2事务的使用

(1)开启事务
    start transaction
(2)执行多条SQL语句
(3)回滚或提交
    roolback/commit

2.3事务的特性:

(1)原子性:把若干个SQL语句打包成一个整体,要么全执行,要么全不执行。
(2)一致性:事务执行完毕之后,数据仍然是合理的。
(3)持久性:事务执行完毕之后,数据存在磁盘上,哪怕重启主机,数据也仍然存在。
(4)隔离性:并发执行的事务所产生的问题和解决方案。

3.谈谈MySQL并发执行事务可能产生的问题

(1)脏读问题
一个事务A在修改数据,另一个事务B直接就读取A正在修改的数据,此时B读到的就是脏数据,这个动作就叫脏读

如何解决:给写操作加锁,并发程度就降低了,同时隔离性就提高了。

(2)不可重复读
事务A修改数据然后提交,提交完毕后事务B开始读取事务,事务B中包含了很多次读操作,如果事务B两次读取的操作得到的结果不一样,就是不可重复读。

如何解决:给读操作加锁,对并发又进一步提供了限制,并发程度更低,隔离性更高。

(3)幻读
事务B正在读取数据,事务A插入了新的数据/删除了某个数据,事务B两次读取到的数据集的个数发生了变化。

如何解决:串行化,彻底让事务之间串行执行,不涉及任何并发事情,一个事务执行完再执行下一个。

4.谈谈MySQL中事务的隔离级别

(1)read uncommitted 没有做出任何隔离限制,三个问题都存在,执行效率最高。

(2)read committed 进行写加锁,并发程度降低,隔离性增加,脏读问题解决。

(3)repeatable read 读写加锁,并发程度降低,隔离性进一步增加,脏读问题以及不可重复读问题解决。
【MySQL默认的隔离级别】

(4)serializable 串行化,并发程度最低,隔离性最高,三个问题都解决了,此时执行效率最低。

  • 4
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值