MySQL索引与事务

目录

一.索引

使用

索引背后的数据结构

B树

B+树 

二.事务

原子性

一致性

持久性

隔离性(最重要)

脏读

不可重复读

幻读

总结


一.索引

索引就像一本书的目录,为的就是提高数据库的查找速率.

但是也有其坏处:会占用更多的空间,拖慢增删改的速度


使用

在创建主键约束,唯一约束,外键约束时,会自动创建对应列的索引

  • 查看索引

show index from 表名;

  • 创建索引

create index 索引名 on 表名(字段名);

  • 删除索引

drop index 索引名 on 表名;

这里注意:创建索引是一件很低效的事, 所以要在设计数据库表时就要创建好.


索引背后的数据结构

索引背后的数据结构是一颗 B+ 树.

那么为什么不用其他的数据结构呢?

  • ArrayList : 需要遍历才能查找,直接pass
  • 二叉(搜索)树 : 虽然最快能达到O(logN),但是单分支树又达到了O(N)
  • AVL树,红黑树 : 虽说避免了单分支的情况,但是免不了数据多后,树会非常高,要进行更多次比较
  • 哈希表 : 键值对的查找方式不适合去找一个范围内的值

这里要想了解 B+ 树, 我们先来了解一下 B 树.


B树

首先B树每个节点都会存储N个Key值

N个Key值对应N+1个空间,每一个区间都对应到一个子树

B树的比较类似于二叉搜索树,从根节点出发,在每层中进行比较找到区间范围

这样子能有效缩短树的高度.


B+树 

但是 B+ 树在 B 树的基础上又进一步做了优化

B+树也是一棵N叉树,但是和B树不同的是:

  • 父节点的值会在子节点中出现(如图中的闭区间)
  • 并且在最后一层用链表将叶子节点串联起来

B+ 树简直就是为数据库量身定制的数据结构

所有的查询最终都会落在叶子节点上,因为叶子节点上存储了索引中的数据,

非叶子节点只会存储索引序号,因此非叶子节点占用空间小,甚至可以缓存到内存中.

   

二.事务

事务简单说就是把若干个操作打包为一个集合来完成复杂的任务;

这里介绍事务的四个特性:


原子性

一个事务内的SQL语句要么全都执行,要么全都不执行.

在运行一个SQL语句后,如果接下里遇到有问题的语句,会进行回滚(roll back)操作,这样子就保证恢

复了数据库本来的样子


一致性

在事务执行之前和之后都要保证数据是合法

比如转账后,钱不能出现负数的情况


持久性

事务一旦提交好就持久化的存储了起来,写入硬盘了.


隔离性(最重要)

隔离性是在并发执行时讨论的,也就是两个事务一起运行,那么就难免会有很多问题.


脏读

事务A和事务B同时运行,A更改数据后,B读取到此值,但由于有异常,A进行了回滚操作

所以此时事务B读取的数据是无效的.

此时的这种情况就是脏读.

对应的方式就是给写操作加锁. 在更改数据时,别的事务无法读取其数据,修改完后才能读取.

这样子就增加了隔离性,但是并发性也随之降低了.


不可重复读

上面的情况是写的时候不能读,但是没有规定读的时候不能写

如果事务C先查询了一个数据,此时事务A更改了此数据,并且立即提交了.

此时C再去读便是更改过的数据.

如果再有一个事务B也更改完立马提交,事务C又读到了一个假数据.

这就是不可重复读问题.

所以我们还可以规定在读的时候,另一个事务不能去写,给读操作加锁.这样子更加增强了隔离性

侧重点在 修改数据


幻读

这里还有一种情况:

事务A先读一个表的数据,假设读到了10条数据.

读完后事务B来插入2行数据,结果A再来读这个表发现第二次有12条数据了.

此时事务A以为自己出现了幻觉,所以此问题也就叫幻读.

这种解决办法就是彻底串行化操作,在一个事务读数据的时候,别的事务都不能来改数据,也不能增加数据个数.

侧重点在 添加和删除数据


总结

并发性和隔离性是不可兼得的.

在开发过程中我们要根据实际需求来更改数据库的隔离级别(在my.ini配置文件中更改)

read uncommitted:   会出现脏读,不可重复读,幻读(隔离性最低,并发性最高)

read committed:       给写加了锁,但会出现不可重复读,幻读

repeatable read:       给读和写都加了锁,但会出现幻读

serializable:              串行化操作,隔离性最高,并行性最低,也就会导致运行速度变慢

  

谢谢你能看到这,一起进步,一起加油(๑•̀ㅂ•́)و✧👍

  • 16
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 6
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

丶chuchu丶

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值