1、索引
1.1 概念
索引是一种特殊的文件,包含着对数据表里所有记录的引用指针。可以对表中的一列或多列创建索引,并指定索引的类型,各类索引有各自的数据结构实现。
1.2 作用
- 数据库中的表、数据、索引之间的关系,类似于书架上的图书、书籍内容和书籍目录的关系。
- 索引所起的作用类似书籍目录,可用于快速定位、检索数据。
- 索引对于提高数据库的性能有很大的帮助。
1.3 B+树
B+树是为了数据库的索引,量身定做的数据结构
我们先来简单了解一下B树,可以看作是一个N叉搜索树
B+树是在B树的基础又做出了改变,也是N叉搜索树,如下图所示:
B+树的特点:
- 一个节点,可以存储N个key,N个key划分出了N个区间(注意不是N + 1 个区间)
- 每个节点中的key的值,都会在子节点中也存在(同时该key是子节点的最大值)
- B+ 树的叶子节点是首尾相连的,类似于一个链表
- 只在叶子节点处存储数据表的每一个数据,非叶子节点只存储key值本身
B+树的优势:
- 减少了树的高度,查询的时候就减少了访问硬盘的次数
- 所有的查询都会落在叶子节点,意味着稳定(查询任何一个数据,访问硬盘的次数是一样的)
- B+树的所有的叶子节点构成链表结构,更加方便进行范围查询
- 非叶子节点只保存key值本身,占用的空间就很小,非叶子节点就有可能在内存中缓存,进一步减少了IO的访问次数(在此指硬盘的访问次数)
2、事务
2.1 概念
事务指逻辑上的一组操作,组成这组操作的各个单元,要么全部成功,要么全部失败。在不同的环境中,都可以有事务。对应在数据库中,就是数据库事务。
事务的本质就是把多个sql语句打包成一个整体,要么全部执行成功,要么就是最后状态保持原样(会有回滚的操作:即是恢复数据),而不会出现执行一半的中间状态。
2.2 使用
(1)开启事务:start transaction;
(2)执行多条SQL语句
(3)回滚或提交:rollback/commit;
说明:rollback即是全部失败,commit即是全部成功。
start transaction;
– 阿里巴巴账户减少2000
update accout set money=money-2000 where name = ‘阿里巴巴’;
– 四十大盗账户增加2000
update accout set money=money+2000 where name = ‘四十大盗’;
commit;
2.3 事务的四大特性ACID
1.原子性:事务的最核心特性,将多个sql语句打包成一个整体来执行
2. 一致性:具体来说就是事务执行前后,数据是正确靠谱的
3. 持久性 :事务修改的内容是写道硬盘上的,持久存在的
4. 隔离性 :为了解决“并发” 执行事务引起的问题,存在的意义就是为了在数据库并发处理事物的时候不会有问题
2.4 并发执行事务可能产生的问题
1. 脏读问题
即是一个事务A正在对数据进行修改的过程中,还没提交之前,另外一个事务B,也对同一个数据进行了读取,此时B的读操作就被称作是"脏读",读到的数据也就是"脏数据"(也就是无效数据)。
解决方案: MySQL引入了"写操作加锁"的机制,也即是事务A修改数据的期间,B不能进行读取操作,“写操作” 和 “读操作” 不能并发了,
此操作降低了并发程度(降低了效率),提高了隔离性(提高了数据的准确性)。
2. 不可重复读
事务1已经提交了数据,此时事务2开始去读取数据。在读取过程中,事务3又提交了新的数据,此时意味着同一事务2之内,多次读取事务,读出来的结果是不相同的(预期是一个事务多次读取的结果应该是一样的,就叫做"不可重复读"。
解决方案: 进行读加锁操作,相当于约定读的过程中,不能进行修改。通过这个读加锁,又进一步降低了事务的并发处理能力(处理效率也降低了),提高了事务的隔离性(数据的准确性)。
2. 幻读
同一个事务中,多次查询返回的结果集不一样。例如
有一个事务查询了几列数据,而另一个事务却在此时插入了新的几列数据,先前的事务在接下来的查询中,就会发现有几列数据是它先前所没有的。这就是幻读。
解决方案: 如果要避免幻读,就得进一步提高隔离性,即“串行化”,完全的没有并行,只有串行. 安全级别最高, 解决了脏读,不可重复读,幻读的问题,同时也是处理效率最低的。
🎗️🎗️🎗️ 好啦,到这里有关索引与事务的分享就结束了,如果感觉做的还不错的话可以点个赞,关注一下,你的支持就是我继续下去的动力,蟹蟹大家了,我们下期再见,拜了个拜~ ☆*: .。. o(≧▽≦)o .。.:*☆