自学内容网 自学内容网

MySql中的索引与事务

查看索引:

show index from 表名;

创建索引:

create index (索引名) on 表名(列名);

删除索引:

drop index 索引名 on 表名;

索引引入了数据结构,来提高查询速度。默认情况下就是遍历表。引入索引,通过数据结构,加快查询的速度,减少遍历表的可能性。

B树

B树本质上就是一个N叉搜索树。

每个节点上可以储存多个元素,延伸出多个子树。

表示同样数量的数据,需要的节点就少了,对应的树的高度也就大大降低了。

索引本质上就是B+树。

1)每个节点上的这些key也是有序排列的,比较的时候可以直接二分查找。

2)B树也会控制,某个节点上保存的key不会太多,如果插入更多的元素,使key变多了,就会是节点分裂出更好的子树。

3)多个数据,都是放在一块的连续的存储空间上,进行比较的时候,一次硬盘IO就能读出整个节点。

B+树相比B树的优势

1)非常方便进行遍历和范围查询。

2)当前任何一次查询操作,最终都是要落到叶子节点完成的,查询任何数据,经历的硬盘IO的次数都是一样的,这个时候,查询操作消耗的时间是稳定的。

3)由于叶子节点,是数据的全集,对应的,非叶子节点中,都是重复出现的数据。

就可以把表每一行的数据,最终都关联到叶子节点这一层,非叶子节点中只保存一个单纯的key值即可。

B+树长什么样子

1)N叉搜索树

2)每个父节点的元素都会在子节点中以最大值的方式存在。

3)叶子节点这一层通过链表连上

B+树的优势

1)方便范围的查询

2)查询操作稳定

3)数据存储在叶子节点,非叶子节点能够在内存中缓存。

事务就是把多个操作,打包成一个整体。

就能够保证,这个整体要么都执行成功,要么就一个都不执行。

有效避免,部分执行,部分未执行,产生的一些“中间状态引起的问题”。

记录日志

1)之前进行了新增操作,就把数据删除掉。

2)之前进行了删除操作,就把数据新增上来

3)之前进行了修改操作,就把数据改回去

4)之前是查询操作,不影响,不需要任何恢复行为

事务的基本特性

原子性 (有回滚机制,能够触发还原)

一致性 

执行事务之前,和执行事务完毕之后,数据是一致的。也是和回滚有关的,一旦触发回滚了,回滚回去的数据得是对的。如果顺利执行没有触发回滚,数据也是要符合要求的

持久性 (把数据储存在硬盘上)

此处的持久,程序重启/主机重启,数据仍然能存在。(不仅仅是数据库,后续但凡见到“持久性”都是这个意思)

隔离性 (描述的是,数据库并发执行事务时,产生的情况(多个客户端,同时给服务器,发起事务))。就是要一起处理,如果一个一个处理,速度会非常慢。

1.脏读问题==》写加锁

脏读就是临时数据,随时都可能会被修改掉。

数据库中,如果有事务A和事务B,事务A针对某个表做出了一些修改,在事务A提交之前,事务B就对这里的数据进行了读取,最终就可能出现A后续的操作又把上述数据进行了修改,导致最终B读到的数据和A提交的数据是不同的。

2.不可重复读问题==》读加锁

存在三个事务ABC

事务A针对数据进行修改,提交;接下来事务B进行读取数据(事务B这里的多个sql都要进行读操作)

在执行B的过程中又有一个事务C,又针对数据进行了修改,就会使B里面的不同读操作,读出来的结果不一样。

3.幻读问题==》串行化

事务A先修改并提交数据,事务B进行读操作,此时事务C,没有修改B读的数据,但是给对应的表进行了新增数据/删除数据等操作......导致事务B中,读到的数据集不同。(解决幻读的方式,“串行化”使所有的事务都严格的按照“一个接一个”的方式执行,完全没有并发了,此时执行效率是最低的,隔离性也是最高的,数据也是最准确的)

mysql提供了4个隔离级别

1)read uncommitted:允许读取其他事务未2提交的数据 =》脏读+不可重复读+幻读 并发程度最高,隔离性最低

2)read committed :只能读取其他事务提交后的数据 =》解决了脏读,存在不可重复读+幻读  并发程度降低,隔离性提高

3)repeatable read :针对读操作和写操作都加锁了 =》解决了脏读+不可重复读,存在幻读  并发程度又降低,隔离性又提高

4)串行化(serializable):所有的事务都是串行执行的 =》解决了脏读+不可重复读+幻读 并发基本没有,隔离性最高


原文地址:https://blog.csdn.net/2302_80113478/article/details/143020182

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!