蒋豆芽的面试题专栏(31/数据库基础)

  1. 数据库事务以及四个特性⭐⭐⭐⭐⭐

  2. 数据库三大范式⭐⭐⭐⭐⭐

  3. 事务的隔离级别⭐⭐⭐⭐⭐

  4. 什么是数据库索引⭐⭐⭐⭐⭐

  5. 索引类型与索引模型⭐⭐⭐⭐⭐

  6. 什么情况下数据库索引会失效⭐⭐⭐⭐⭐

  7. 引起慢查询的常见原因及一些解决方案⭐⭐⭐⭐⭐

  8. 聚簇索引与非聚簇索引⭐⭐⭐⭐⭐

  9. 数据库主键和外键⭐⭐⭐⭐⭐

  10. mysql知道哪些存储引擎,它们的区别⭐⭐⭐⭐⭐

  11. 关系型数据库和非关系型数据库的区别⭐⭐⭐⭐⭐

  12. 数据库垂直与水平拆分怎么做⭐⭐⭐⭐⭐

  13. 什么是内联接、左联接、右联接⭐⭐⭐⭐⭐

  14. 乐观锁与悲观锁⭐⭐⭐⭐⭐

  15. MVCC原理⭐⭐⭐⭐⭐

  16. B树与B+树⭐⭐⭐⭐⭐

=========================================================================================================

  • 本专栏适合于C/C++已经入门的学生或人士,有一定的编程基础。
  • 本专栏适合于互联网C++软件开发、嵌入式软件求职的学生或人士。
  • 本专栏针对面试题答案进行了优化,尽量做到好记、言简意赅。这才是一份面试题总结的正确打开方式。这样才方便背诵
  • 针对于非科班同学,建议学习本人专刊文章《蒋豆芽的秋招打怪之旅》,该专刊文章对每一个知识点进行了详细解析。
  • 如专栏内容有错漏,欢迎在评论区指出或私聊我更改,一起学习,共同进步。
  • 相信大家都有着高尚的灵魂,请尊重我的知识产权,未经允许严禁各类机构和个人转载、传阅本专栏的内容。

=========================================================================================================

  1. 数据库事务以及四个特性⭐⭐⭐⭐⭐

    数据库事务( transaction)是访问并可能操作各种数据项的一个数据库操作序列,这些操作要么全部执行,要么全部不执行,是一个不可分割的工作单位。事务由事务开始与事务结束之间执行的全部数据库操作组成。数据库事务是数据库最小逻辑单元。

    四个特性

    1. 原子性(Atomicity):原子性是指事务包含的所有操作要么全部成功,要么全部失败回滚。失败回滚的操作事务,将不能对事务有任何影响。

    2. 一致性(Consistency):一致性是指事务必须使数据库从一个一致性状态变换到另一个一致性状态,也就是说一个事务执行之前和执行之后都必须处于一致性状态。例如:A和B进行转账操作,A有200块钱,B有300块钱;当A转了100块钱给B之后,他们2个人的总额还是500块钱,不会改变。

    3. 隔离性(Isolation):隔离性是指当多个用户并发访问数据库时,比如同时访问一张表,数据库每一个用户开启的事务,不能被其他事务所做的操作干扰(也就是事务之间的隔离),多个并发事务之间,应当相互隔离。

      例如同时有T1和T2两个并发事务,从T1角度来看,T2要不在T1执行之前就已经结束,要么在T1执行完成后才开始。将多个事务隔离开,每个事务都不能访问到其他事务操作过程中的状态;就好比上锁操作,只有一个事务做完了,另外一个事务才能执行。

    4. 持久性(Durability):持久性是指事务的操作,一旦提交,对于数据库中数据的改变是永久性的,即使数据库发生故障也不能丢失已提交事务所完成的改变。

  2. 数据库三大范式⭐⭐⭐⭐⭐

    1. 第一范式(1NF):数据表中的每一列(每个字段)必须是不可拆分的最小单元,也就是确保每一列的原子性;(比如“姓名与年龄“,我们应该拆分成两个字段:“姓名“、“年龄“。)
    2. 第二范式(2NF):满足1NF后,要求表中的所有列,都必须依赖于同一个主键,而不能有任何一列与主键没有关系,也就是说一个表只描述一件事情;(比如我们主字段是教师的“姓名“,那么字段“年龄“、“工号“、“工资“、“电话“都是与教师相关的,而字段“销售额“跟我们教师没有关系,就要去掉。)
    3. 第三范式(3NF):必须先满足第二范式(2NF),要求:表中的每一列只与主键直接相关而不是间接相关;(如果某一属性依赖于其他非主键属性,而其他非主键属性又依赖于主键,那么这个属性就是间接依赖于主键)
  3. 事务的隔离级别⭐⭐⭐⭐⭐

    事务的隔离性就是指,多个并发的事务同时访问一个数据库时,一个事务不应该被另一个事务所干扰,每个并发的事务间要相互进行隔离。

    1. 读未提交(Read Uncommitted):因为没有行级共享锁,会出现脏读

      脏读就是,比如两个事务都在操作同一个表,A事务修改了C字段的值没有提交该事务;而B事务也在读取C字段的值,就在这时A事务发生了失败回滚,那么C字段的值返回原来的值,所以B事务发生了脏读。整个过程结束,数据库没有发生任何改变,B事务却读到了奇怪的值,这就是脏读。解决办法是行级共享锁。

    2. 读提交(Read Committed):通过行级共享锁,解决了脏读问题,但因为事务没有加锁,导致前后读取数据不一致,即不可重复读

      不可重复读就是,比如两个事务都在操作同一个表,A事务先读取了C字段的值后继续操作下一个字段;而B事务在这个时候修改了C字段的值。A事务再读取C字段的值,发现同一个事务下,竟然前后两次读取不一样,这就很怪异了,这就是不可重复读。解决办法是对事务进行加锁。

    3. 可重复读(Repeated Read):通过事务加锁,解决了不可重复读问题,但因为表没有加锁,会出现幻读的情况,比如多了一行数据。

      幻读就是,比如两个事务都在操作同一个表,A事务先读取了表的行数;而B事务在这个时候为表格新插入了一行数据。A事务再读取表的行数,发现竟多了一行,这就很怪异了,这就是幻读。解决办法是对表进行加锁。

    4. 串行化(Serializable):可解决脏读、不可重复读、幻读问题,通过对表直接加锁的方式

剩余60%内容,订阅专栏后可继续查看/也可单篇购买

- 本专栏适合于C/C++已经入门的学生或人士,有一定的编程基础。 - 本专栏特点: 本专刊囊括了C语言、C++、操作系统、计算机网络、嵌入式、算法与数据结构、数据库等一系列知识点,总结出了高频面试考点(附有答案)共计309道,事半功倍,为大家春秋招助力。 - 本专栏内容分为七章:共计309道高频面试题(附有答案)

全部评论
从MySQL5.5版本之后,MySQL的默认内置存储引擎已经是InnoDB了。
2 回复 分享
发布于 2021-03-19 17:29
谢谢分享,希望楼主继续更新哈
1 回复 分享
发布于 2021-03-14 09:16
看的人这么少没天理啊
1 回复 分享
发布于 2021-03-14 22:07
这章是数据库方面的,针对C++后台软件开发求职的同学,嵌入式求职的同学可以跳过
点赞 回复 分享
发布于 2021-03-11 10:00
多多点赞,会变好看,多多留言,会变有钱。
点赞 回复 分享
发布于 2021-03-11 10:00
补充下索引:(1)优点,加快检索速度;缺点,创建和维护索引消耗时间,并且占用物理空间,若有DML语句会导致索引更新,效率变低(2)什么条件下添加索引:频繁出现在where之后;极少的DML语句;数据量大,并且取值很多;总之,考虑修改性能远低于检索(3)主键和唯一会自动添加索引(4)原理:主要是通过B+树缩小了查找区间,因为底层对索引进行排序并分区,同时携带物理地址,进而查找到数据后直接访问物理地址。不使用索引就是全表扫描,所以索引效率高(5)失效:如正则表达的'%xx',因为第一个都不知道,无法对其分区定位,全表扫描
点赞 回复 分享
发布于 2021-05-14 14:29
补充下,主键和外键:(1)主键primary key,既不能重复也不能为NULL,第一范式规定任何一张表都应该有主键,主键最好是与业务无关的自然数(不要是身份证,银行卡之类的)(2)外键foreign key,可以为NULL,引用一般为主键,但至少都必须是unique的唯一性约束
点赞 回复 分享
发布于 2021-05-14 15:01
简要表达下乐观锁与悲观锁:(悲观锁)事务必须排队执行,锁住数据不允许并发;(乐观锁)支持并发,事务不需要排队,需要添加一个版本号,每当发现版本号和之前读的不一致就会回滚
点赞 回复 分享
发布于 2021-05-14 15:59
分享下MVCC原理,目的:在不加锁的条件下也可以提高并发事务的读写性能,加锁机制可以控制并发但是开销很大。场合:用于读已提交和可重复读。实现:一般在末尾添加两个隐藏列,一个是事务id(DB_RTX_id),另外一个是回滚指针(DB_ROLL_PTR),只有DML操作才会生成事务ID.(1)当有DML操作时,将插入新数据,将旧数据放在undo日志中,且回滚指针指向旧数据(2)时间序列上第一个select会建立一致性视图read_view,由未提交事务id数组+最大事务id组成,通过比对链就可以确定数据(3)比对链规则:DB_RTX_id小于min_id已提交-可见;DB_RTX_id大于max_id未开始事务,不可见;DB_RTX_id在min_id和max_id之间,分两种,若row在数组中,未提交-不可见,不在数组中,已提交-可见。这块有一个视频:https://www.bilibili.com/video/BV1YJ411J7vb?from=search&seid=5325901820680320807
点赞 回复 分享
发布于 2021-05-14 16:26
疑问:不可重复读通过事务加锁解决了,但是下面出现的幻读的例子如果在事务加锁的情况下应该不会发生吧?A事务执行到一半B事务就进来执行了,这种情况是事务没有加锁吧? 可重复读(Repeated Read):通过事务加锁,解决了不可重复读问题,但因为表没有加锁,会出现幻读的情况,比如多了一行数据。 幻读就是,比如两个事务都在操作同一个表,A事务先读取了表的行数;而B事务在这个时候为表格新插入了一行数据。A事务再读取表的行数,发现竟多了一行,这就很怪异了,这就是幻读。解决办法是对表进行加锁。
点赞 回复 分享
发布于 2022-04-14 01:18

相关推荐

只写bug的程序媛:人家说一本以上,不是及以上
点赞 评论 收藏
分享
评论
2
1
分享
牛客网
牛客企业服务