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)!