MySQL中的索引和事务

索引

什么是索引

索引就类似于我们一本书的目录,存储了书中的主要信息,通过目录就能很快地找到你想要找的的章节内容

MySQL中的索引也是这个作用,通过索引能够很快的查找到你想要检索的数据

索引的优点与缺点

优点:通过索引能够快速的进行查找,提高查找的效率

缺点:

1、时间成本:虽然索引能够提高查找的效率,但是当进行增删改的操作时,索引也要发生修改。

想想看,一本书中的内容发生改变了,那么这本书的目录自然也要发生相应的改变。这势必会造成

时间开销。在之前没有索引时增删改操作结束后就ok了,但是有了索引后又要对索引进行相应的修

改,时间自然也就增加了。

2、空间成本:既然索引是保存书中内容的主要信息,那么也一定要占用内存。并且索引所占空间

大小是与数据库中的数据量成正比的,数据越多,索引所占的空间也就越多。

怎么实现索引

那接下来就是很关键的一个问题:如何实现索引呢?

索引底层的数据结构到底是什么,怎么把索引组织起来的呢

首先我们可以考虑下常见的数据结构

顺序表:顺序表如果想要查找一个值,时间复杂度是O(N),不满足索引的要求。

(注意:顺序表能够以O(1)的时间复杂度来返回下标元素,但此处说的是按值查找,所以顺序表还是需要遍历整个数组)。

链表:通过链表查找一个值的时间复杂度也是O(N),也不满足条件。

二叉搜索树:虽然二叉搜索数的平均时间复杂度是O(logn),但是在最坏情况下,也就是此时的二叉搜索树是一颗单分支树时时间复杂度也是O(n)。

哈希表:哈希表确实能很快的查找到指定的数据,但是哈希表存在一个缺点就是它只能查找到相等的数据,而不能进行范围查找。比如我想要查找15~50之间的数据,此时哈希表是做不到的。

以上的这些数据结构都不能满足要求

下面我们来看看这两种数据结构

B树

 

B树也是树的结构,但它是一颗n叉树,所以树的高度能够得以控制,每个节点有n颗子树。

根节点上有n个key值,通过这n个key值又分成了n+1个区间。在查找元素时通过确定key值进

而去子树中查找范围内的数据,再进一步进行查找。虽然在子树中也必须得遍历查找,但由

于这些数据是存放在内存中的,因此查找的效率也能进一步的提高。

B+树

B+树天然就是为索引而生的

 

首先B+树也是一种树的结构,并且是B树的优化版本。B+树的根节点拥有n个子树。根节点

中存放了n个key值,子树分成了n+1个区间。并且根节点的每个值都在子节点中有所体现。

这样能进一步确定查找的数据。所有的数据都是存放在叶子节点的,而非叶子节点只是存放

着key值,因此可以放在内存中,最后叶子节点用链表连接起来。当通过非叶子节点查找到范

围值的时候,只需要截取子链表,然后对子链表进行遍历查找即可。这样的话IO访问的次数

就减少了,查找的效率也进一步提升。

所以实现索引的数据结构实际是B+树

通过B+树组织索引能够减少IO访问的次数从而快速的查找到指定的元素。

事务

什么是事务
事务就是将多个SQL操作组合成一个操作。这个操作要么全部执行,要么一个都不执行。

为什么使用事务

一个很典型的应用就是我们日常生活中用到的转账

比如A账户上有1000元

B账户上也有1000 元

此时A需要给B进行转账500元,那么就需要扣除A账户中的500元,然后在给B账户上增加500元。可是设想一个问题,如果在执行第一个操作时结束后,网络突然断开了,那么这时候第二个操作就不能执行了,也就是说B账户上就不能到账500元。

此时解决这个问题就需要用到事务了。数据库也是如此

事务是怎么实现的

明白了事务的重要性后,那数据库到底怎么实现事务呢

首先我们先把多个SQL语句包装成一个事务,这时数据库开始执行第一个操作,只不过数据库会把执行过的操作记下来,如果执行完第一个操作后,第二个操作不能执行,就会将刚才执行过的第一个操作回退回去,这位就消除了第一个操作带来的影响。在表面看来就好像两个操作从来都没有执行一样。

数据库中的使用

(1)开启事务:start transaction;


(2)执行多条SQL语句


(3)回滚或提交:rollback/commit;


说明:rollback即是全部失败,commit即是全部成功。

代码举例:
start transaction;
-- A账户减少2000
update accout set money=money-500 where name = 'A';
-- 四十大盗账户增加2000
update accout set money=money+500 where name = 'B';
commit;
 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值