2021-08-10 00:47 MySQL


别人写的面试,引擎很全

一、数据库引擎

(一)InnoDB和MyISAM的区别

(1)InnoDB支持事务, MyISAM不支持.
(2)InnoDB支持行级锁, MyISAM支持表级锁.
(3)InnoDB支持外键, MyISAM不支持.
(4)MyISAM支持全文索引, InnoDB不支持

二、ACID和CAP

(一)ACID

1.原子性(A-atomicity):是指事务是一个不可分割的工作单位,事务中的操作要么都发生,要么都不发生。
2.一致性(C-consistency):指事务前后数据的完整性必须保持一致。
3.隔离性(I-isolation):指多个用户并发访问数据库时,一个用户的事务不能被其他用户的事务所干扰,多个并发事务之间数据要相互隔离。
4.持久性(D-durability):是指一个事务一旦提交,它对数据库中数据的改变就是永久性的,即便数据库发生故障也不应该对其有任何影响。

(二)CAP

1.一致性(C):在分布式系统中的所有数据备份,在同一时刻是否同样的值。(等同于所有节点访问同一份最新的数据副本)
2.可用性(A):保证每个请求不管成功或者失败都有响应。
3.分区容忍性(P):系统中任意信息的丢失或失败不会影响系统的继续运作(三者不可兼得)

三、数据库索引

最左匹配
索引写的很好!

(一)什么是索引

索引在MySQL中也叫做“键”,是存储引擎用于快速找到记录的一种数据结构

(二)索引的原理—查字典,看目录

(三)索引的种类

1.普通索引index :加速查找
2.唯一索引:唯一的,不允许重复
主键索引:primary key :加速查找+约束(不为空且唯一)
唯一索引:unique:加速查找+约束 (唯一)
3.联合索引
-primary key(id,name):联合主键索引
-unique(id,name):联合唯一索引
-index(id,name):联合普通索引
4.全文索引fulltext :用于搜索很长一篇文章的时候,效果最好。

(四)索引的创建依据

  1. 表的主键、外键必须有索引;
  2. 数据量超过300的表应该有索引;
  3. 经常与其他表进行连接的表,在连接字段上应该建立索引;
  4. 经常出现在Where子句中的字段,特别是大表的字段,应该建立索引;
  5. 索引应该建在选择性高的字段上;
  6. 索引应该建在小字段上,对于大的文本字段甚至超长字段,不要建索引;
  7. 复合索引的建立需要进行仔细分析;尽量考虑用单字段索引代替:
    (1)正确选择复合索引中的主列字段,一般是选择性较好的字段;
    (2)复合索引的几个字段是否经常同时以AND方式出现在Where子句中?单字段查询是否极少甚至没有?如果是,则可以建立复合索引;否则考虑单字段索引;
    (3) 如果复合索引中包含的字段经常单独出现在Where子句中,则分解为多个单字段索引;
    (4)如果复合索引所包含的字段超过3个,那么仔细考虑其必要性,考虑减少复合的字段;
    (5)如果既有单字段索引,又有这几个字段上的复合索引,一般可以删除复合索引;
  8. 频繁进行数据操作的表,不要建立太多的索引;
  9. 删除无用的索引,避免对执行计划造成负面影响;

(五)索引的作用?它的优点缺点是什么?

索引作用(优点):协助快速查询、更新数据库表中数据。
为表设置索引要付出代价的(缺点)
是增加了数据库的存储空间
是在插入和修改数据时要花费较多的时间(因为索引也要随之变动)。

(六)说说聚集索引和非聚集索引区别?

聚集索引:表中数据的顺序与索引的顺序一致(查字典按拼音查)
非聚集索引:表中数据的顺序与索引的顺序不一致(查字典按偏旁部首)

MyISAM的是非聚簇索引,B+Tree的叶子节点上的data,并不是数据本身,而是数据存放的地址。主索引和辅助索引没啥区别,只是主索引中的key一定得是唯一的。这里的索引都是非聚簇索引。非聚簇索引的两棵B+树看上去没什么不同,节点的结构完全一致只是存储的内容不同而已,主键索引B+树的节点存储了主键,辅助键索引B+树存储了辅助键。表数据存储在独立的地方,
这两颗B+树的叶子节点都使用一个地址指向真正的表数据,对于表数据来说,这两个键没有任何差别。由于索引树是独立的,通过辅助键检索无需访问主键的索引树。InnoDB的数据文件本身就是索引文件,B+Tree的叶子节点上的data就是数据本身,key为主键,这是聚簇索引。聚簇索引,叶子节点上的data是主键(所以聚簇索引的key,不能过长)。

InnoDB使用的是聚簇索引,将主键组织到一棵B+树中,而行数据就储存在叶子节点上,若使用"where id = 14"这样的条件查找主键,则按照B+树的检索算法即可查找到对应的叶节点,之后获得行数据。若对Name列进行条件搜索,则需要两个步骤:第一步在辅助索引B+树中检索Name,到达其叶子节点获取对应的主键。第二步使用主键在主索引B+树种再执行一次B+树检索操作,最终到达叶子节点即可获取整行数据。
来源

(七)为什么采用B+数而不是B数,二叉树

Hash查找也很快,但是不是按照大小排序的,它无法按照范围进行查找;
平衡二叉树数据小的都在根节点的左面,数据大的都在根节点的右面,有顺序,但是数据量过多,高度过高,容易退化成链表;
B树将二叉树改为多路平衡查找树,解决了树过高的问题,把之前的每个节点存一个数据变成了存多个数据,底层存数据段的形式。
B+树的具体数据保存在叶子节点(最底层)上面。与B树对比的话,B+树多了一个链表。这样我们取区间数据的时候可以不用每一个数据都走一遍索引。降低了空间复杂度。
各种树的特点

四、数据库隔离级别

读未提交(RU): 一个事务还没提交时, 它做的变更就能被别的事务看到.
读提交(RC): 一个事务提交之后, 它做的变更才会被其他事务看到.
可重复读(RR): 一个事务执行过程中看到的数据, 总是跟这个事务在启动时看到的数据是一致的. 当然在可重复读隔离级别下, 未提交变更对其他事务也是不可见的.
串行化(S): 对于同一行记录, 读写都会加锁. 当出现读写锁冲突的时候, 后访问的事务必须等前一个事务执行完成才能继续执行.
在这里插入图片描述

五、存储过程和函数的区别

(1)存储过程用户在数据库中完成特定操作或者任务(如插入,删除等),函数用于返回特定的数据。
(2)存储过程声明用procedure,函数用function。
(3)存储过程不需要返回类型,函数必须要返回类型。
(4)存储过程只能通过out和in/out来返回值,函数除了可以使用out,in/out以外,还可以使用return返回值。
(5)sql语句(DML或SELECT)中不可用调用存储过程,而函数可以。

这东西,不全是我自己写的,不会不理解的是网上找到的,由于来自很多不同的博主,所以没法一一贴出,感谢!我只是想自己复习用,见到错误多多提醒,见到相同处还望海涵

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值