索引和事务

一.索引

索引是一种数据结构,可以帮助我们快速的进行数据的查找

1.目的:

加快查询效率,拖慢插入/修改删除的效率,应用在经常查询但是很少修改的场景上(这样的场景是非常常见的)

2.结构:

B+树,N叉搜索树,使用链式结构把每一层的结点再连接在一起,叶子结点上保存数据,非叶子结点上只是用来辅助查找
主键索引和其他索引还不太一样,主键索引中叶子结点存储的就是一条一条记录,借助主键进行查找,一次到位就能完成查找
其他列索引存储的主键的ID值,先根据索引找到主键ID再拿着主键ID再主键索引中查找
为啥不用hash表
hash表无法实现模糊匹配

3.操作索引的基本命令

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

二.事务

事务的一个典型应用–转账
A把钱转给B的时候,分成两个步骤来操作
1)A的账户–钱 5000 A–>B2000
2)B的账户+钱 1000
当执行完1 的时候,可能出现极端情况,导致2没有正确执行,此时数据就出错了。
事务(一组操作的集合)就是为了解决上面的这个问题的

三.事务的四个基本特性

1.原子性

一个事务是一个不可分割的工作单位,其中包含的操作,要么就全部正确执行完,要么就一个都不做(并不是真的没做,而是通过回滚把数据自动恢复了)
如果执行过程中,第一步成功了。第二步出现问题了,为了避免数据出现错误,往往都会进行回滚(rollback)

2.一致性:

事务执行前后,数据都要处在一种合法的情况
A 5000 A–>B2000
B 1000
隐含条件:
i)转账之前和转账之后,都得保证A和B的金额相加始终等于6000
ii)金额不能为负的

3.持久性:

事务一旦被提交(执行完了),对于数据库的修改就应该是永久的,接下来的其他操作/故障,都不会影响刚才事务的正确性
事务1:A–>B 1000 事务2:A–>B 1000
当事务1执行成功后,后面无论出现啥极端情况(事务2无论咋样)都不会堆事务1造成影响

4.隔离性:

多个事务并发执行的时候,事务的内部操作和其他操作是相互隔离的(没有影响)
并发:一台计算机,同时运行着多个应用程序,对于一个CPU来说,同一时刻只能执行一个程序的代码CPU会先执行程序1一小会,保存程序1的上下文,切换到执行程序2,执行一小会之后执行程序3,执行一小会之后再执行程序1…
从微观上看CPU上的程序都是串行执行的,但是由于切换速度 极快,从宏观上看,感觉多个程序好像是“同时”执行这就是并发
多线程是解决并发编程的方式之一,还有多进程,多协成,actor模型…
**并行:**如果你有两个CPU微观上看,CPU1执行画图板,CPU2执行IDEA两个程序也是“同时”执行的,实际编程中,一般不太严格区分并行和并发,都用“并发”来描述
并发带来的问题
当第一次转账的时候,计算5000-1000在这个计算生效之前,并发式的执行了第二个事务,第二个事务也需要读取A的账户余额,余额还是5000,两次事务建完,A的余额还是4000
为啥并发会出现这样的效果:
本质原因在于多个任务并发执行的时候,执行A到底执行多少代码切换到B,是未知的,B执行多少,切换到A也是未知的,都是由操作系统底层的调度器实现(万恶之源)=>抢占式执行
由于并发编程编程太难了,有些语言压根就不支持并发,或者说搞一个“假的”并发
并发能提高程序的执行效率,如果在不影响数据正确性的情况下,我们还是希望能够尽可能的让多个操作(事务)并发执行
隔离性就是描述并发执行过程中所对应到的一些问题的
并发操作数据库可能带来的问题
不仅仅是数据库中会出现,之要是并发编程中都可能会涉及
1)脏读
A事务读取到了B事务未提交的内容,而B事务后面进行了回滚
2)幻读
A事务读取了一个范围的内容,而同时B事务在此期间插入了一条数据,造成幻觉
3)不可重复读
当设置A事务只能读取B事务已经提交的部分,会造成在A事务内的两次查询,结果竟然不一样,因为在此期间B事务进行了提交操作
怎么解决这些问题呢
MySQL的四种隔离级别如下:
a)未提交读(READ UNCOMMITTED)
允许读取未提交的数据,并行最大,隔离最低,会产生脏读问题
b)已提交读(READ COMMITTED)
只允许读取提交的数据,相当于写加锁,并行降低了一点,能够避免脏读问题,但是存在不可重复读
c)REPEATABLE READ(可重复读)
读写的时候都加锁,此时并行进一步降低,隔离进一步提高了,能够避免不可重复读问题,存在幻读问题(默认隔离级别)
4)SERIALIZABLE(可串行化)
严格串行执行,隔离程度最高,并行程度降低,能够避免幻读问题

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值