数据库-索引与事务详解

索引与事务

问题1.索引是什么?
索引相当于一本书的目录,能够帮助人们快速找到想要找的东西.从数据库的角度来说:当从数据库进行查找的时候,按照一定的条件来查找.
问题2.索引的意义,好处与坏处
索引的意义在于:提高查找的效率.代价为:消耗了额外的存储空间,而且存储的数据量越大消耗的空间越多.(注:相当于用空间换时间)
问题3.索引的使用场景

  • 对于中大型表建立索引非常有效,对于非常小的表,一般全部表扫描速度更快些。
  • 对于超大型的表,建立和维护索引的代价也会变高,这时可以考虑分区技术。
  • 表的查询操作非常多,而增删改操作非常少的情况下.
  • 多个字段经常被查询的话可以考虑联合索引。
  • 字段多且字段值没有重复的时候考虑唯一索引。 字段多且有重复的时候考虑普通索引
    总结:查询操作十分频繁,且数据量过多,的情景下都可以考虑索引

问题4.索引背后的数据结构-B+树.

- 问题4.1:为什么索引不用其他数据结构?
常见的数据结构有:链表,队列,栈,二叉树,AVL树,红黑树,哈希表.
其中,链表,队列,栈等数据结构是主要是存储在内存才能进行比较,第一内存存不下这么多数据,第二也不能进行模糊匹配.
二叉树,AVL,红黑树等数据结构在数据量大到一定程度情况下,比如10亿个数据,那么树的高度,就非常高了.所以这些数据结构被树的高度限制.
哈希表确实非常的好用,但是哈希表要全部存于内存才能查找,内存存放不下这么多数据,而且哈希表的查找是单个查找,不能实现数据库的模糊匹配等功能且哈希表不能比较大小.

-问题4.2:B+树怎样实现?
要想说明白B+树,就必须先说B树(另一种写法B-树),因为B+树正是在B树的基础上作出了一些改进,使它更符合数据库的使用场景.
B树可以认为一种n叉搜索树(想想二叉树,分2个叉),B树n个key值就会引出n+1个区间
(B树的形状大概为这种,此处简略说一下)
在这里插入图片描述

B+树又在B树的基础上作出了一些改进:它将叶子节点划分的区间收尾链接起来,而且将所有数据都存储在叶子节点.如图
在这里插入图片描述
注意:B+树没有大于15的值了,也就是说B+树有N个节点就划分N个区间.

-问题4.3:使用B+树有什么好处?
1:由于所有查询最终会落到叶子结点上,所以访问任何数据的IO次数是一样的,查找速度稳定.

2:由于数据都在叶子节点上,非叶子节点只存储key值,所以非叶子节点占用的空间很小,可以在内存中缓存(或缓存一部分),进一步减少了IO次数.
3:B+树的叶子区间链接起来,适合范围查询.

- 问题4.4:B+树的特点有哪些?
1:一个节点,可以存储N个key,N个key值划分出N个区间~~
2:每个节点中的key的值,都会在子节点中存在的,(同时该key是子节点的最大值)
3:B+树的叶子节点,是首尾相连,类似于一个链表
4:由于叶子结点是完整的数据集合,只在叶子结点存储数据表中的每一行数据,而非叶子节点只保存key值查询.
问题4:问什么不用按下标来访问元素?
- 问题5:如何使用数据库的索引?
1:在建表的时候给字段增加索引
2:在创建完毕后,增加索引
3:显示所有的索引信息
show index from 表名
4: 增加一个索引
alter table school.student add fulltext index studentname(studentname)
注:school.student 该表的列 fulltext 为全文索引关键字

事务

问题1:数据库中的事务是什么?
事务的目的就是为了把若干个独立的操作打包成一个整体,要么将事务全部执行完,要么就是一个操作都不执行,不存在执行第一步,而不执行第二步的情况.
这种全部执行完,任务不可以在细分被称为原子性
问题2:事务中的原子性是怎么保证的呢?
因为没有办法预知,下一条指令,所以指令还是得一条条执行,只不过执行失败以后,由数据库自动进行一些’还原性’的操作,来消除前面的sql语句带来的影响,使指令看起来没被执行过一样.
注:数据还原的操作,我们称之为回滚
问题3:数据库如何知道该还原成那个值?
数据库会把执行过的每个操作,都记录下来.记录操作过程搭配了日志+数据库内置的一些表来完成的.
注:记录只是局部的,不能恢复删库.
问题4:谈谈事务的基本特性
1:原子性:要么全部执行完,要么一个都不执行
2:一致性:事务执行前,和事务执行后,数据是合理合法的
3:持久性:事务一旦提交之后,数据就持久化存储起来了(数据被写入到了硬盘)
4:隔离性(*):描述事务并发执行的情况,产生的情况.

问题5:什么是并发编程?
并发:指的是多个程序可以同时运行的现象,更细化的是多进程可以同时运行或者多指令可以同时运行。
并发编程:指多个程序一起运行,是当下最主要的编程方式.(造成这个原因是:计算机单核提升能力达到了瓶颈)
要想深入了解并发,就必须了解隔离,并发与隔离是相对的.
问题6:MySQL中的隔离性
1:read uncommitted:并发最高,隔离最低,允许读取未提交的数据,但会引入,脏读,不可重复读,幻读的问题.
2:read committed :解决脏读问题,会引入不可重复读与幻读,作用为:只允许读取提交之后的数据(写的时候不能读)
3:repeatable read: 解决脏读问题与不可重复读的问题,写的时候不能读,读的时候不能写 , 会引入幻读
4:serializable:该单词意思为:串行化,隔离性最高,并发性最低,解决脏读,不可重复读,幻读的问题
注:

  • 脏读:举个例子便是,一个A写一个数字,另一个人B读出该数字,但A没有写完该数字,所以造成AB最终的结果不一致.(写的时候读)
  • 不可重复读:例子为,A在读的时候,B在写入数据,使得A这次读取的数据与下次读取的数据不一致.(读的时候写)
  • 幻读:例子为:现在读的时候不能写,和写的时候不能读,当A在读取本数据的时候,B去修改另一个数据.当B修改的数据与A读取的数据有关联的时候,从而造成A读取出来的数据的结果集不一致.

注:这里说的并发,并不深究是并发与并行的区别。只有在线程的时候才去分别并发与并行。大多数情况下统一用并发来代替二者。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值