索引
什么是索引
索引就类似于我们一本书的目录,存储了书中的主要信息,通过目录就能很快地找到你想要找的的章节内容
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;