面试——数据库

事务

四大特性(ACID)

  • 原子性:一个事务中的操作要么全部完成,要么全部不完成,事务如果执行错误了,会被回滚。
  • 一致性:在事务开始之前和事务结束以后,数据库的完整性没有被破坏。这里可以举一个字段不能为null,结果却不填写。
  • 隔离性:数据库允许多个并发事务同时对其数据进行读写和修改的能力。事务隔离分为不同级别,包括未提交读(Read uncommitted)、提交读(read committed)、可重复读(repeatable read)和串行化(Serializable)。
  • 持久性:事务处理结束后,对数据的修改就是永久的,即便系统故障也不会丢失。

事务的隔离级别

一个详细的博客

  • Read uncommitted 读未提交:
    id =1 的areaname=“重庆”,事务A update area set areaname=“成都” where id=1,但还没有commit,事务B select areaname where id=1,读到了成都。
  • Read Commited 读已提交:
    id =1 的areaname=“重庆”,事务A update area set areaname=“成都” where id=1,但还没有commit,事务B select areaname where id=1,读到了重庆。 (因为事务A还没有提交事务A提交之后,就可以读到成都)
  • Repeatable Reads 可重复读
    id =1 的areaname=“重庆”,事务A update area set areaname=“成都” where id=1,commit之后,事务B select areaname where id=1,读的还是重庆。 (因为事务B还没有提交事务B提交之后,下一个事务读到的id=1的areaName就是重庆)
  • Serializable 串行化
  • 在这里插入图片描述

索引

为什么要使用索引:避免全表扫描,提升查找效率
两种索引:HashMap和B树,B+树。索引存放在硬盘中。

一个关于索引优化–最佳左前缀法则的深度好文

https://mp.weixin.qq.com/s/pmXU9q3m1COibOXsEvIGzQ

B树

  • B树种所有结点孩子结点个数的最大值称为B-树的阶,通常用m表示。
  • 每个结点最多有m个分支,如果是根节点且不是叶子结点,至少有两个分支,非根非叶子结点至少有ceil(m/2)个分支。每个结点的结构如下图所示。
  • 叶结点处于同一层,可以用空指针表示,是查找失败到达的地方。
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

密集索引和稀疏索引:

  • 密集索引:文件中的每个搜索码值都有一个索引项。
  • 稀疏索引:只为搜索码的某些值建立索引项。只有当关系按搜索码排列顺序存储时才能使用稀疏索引。

InnoDB和MyISAM区别

功能上的区别

来源https://kinsta.com/knowledgebase/convert-myisam-to-innodb/

  1. InnoDB:行级锁,MyISAM:只有表级锁
  2. InnoDB支持外键约束,MyISAM不支持。
  3. InnoDB支持事务,(可以commit还有roll back),MyISAM不支持
  4. InnoDB is more reliable as it uses transactional logs for auto recovery. MyISAM does not.
  5. InnoDB要求表必须有主键(如果不存在这种列,则MySQL自动为InnoDB表生成一个隐含字段作为主键),MyISAM可以没有主键。
MyISAM与innoDB的存储上的区别:

MyISAM:每个MyISAM在磁盘上存储成三个文件。
(1).frm 用于存储表的定义。(2).MYD 用于存放数据。(3).MYI 用于存放表索引
InnoDB:所有的表都保存在同一个数据文件中(也可能是多个文件,或者是独立的表空间文件),InnoDB表的大小只受限于操作系统文件的大小,一般为2GB。
MyISAM和InnoDB用的都是B+树,两者的叶子结点不一样:
myISAM的叶子结点存储的是记录的地址,而InnoDB的表数据文件本身就是一个按照B+树组织的一个索引结构,这个索引是数据表的主键,叶子结点的data域存储了完整的数据记录。
详细见https://blog.csdn.net/donghaixiaolongwang/article/details/60751543

应用场景

MyISAM管理非事务表。它提供高速存储和检索,以及全文搜索能力。如果应用中需要执行大量的SELECT查询,那么MyISAM是更好的选择。
InnoDB用于事务处理应用程序,具有众多特性,包括ACID事务支持。如果应用中需要执行大量的INSERT或UPDATE操作,则应该使用InnoDB,这样可以提高多用户并发操作的性能。

聚集索引和非聚集索引

MyISAM的索引方式是非聚集的,InnoDB的主键索引是聚集索引,InnoDB的表只能有一个聚集索引。聚集索引的键值的逻辑顺序决定了表中相应行的物理顺序,非聚集索引没有决定(对这个说法存疑)。
聚集索引,B+数的叶子节点存的是整行数据,直接通过这个聚集索引的键值找到某行。

面试问题

  • 介绍一下关系型数据库的理论基础(关系代数,范式)
  • 给定一个场景,设计表结构
  • 给定表结构,按要求写出SQL语句
  • 什么是事务的ACID属性?事务有哪些隔离级别?
  • 事务的性能太慢怎么办?(乐观锁)
  • 数据库索引的作用:
    加快查找速度。约束数据的值,如UNIQUE INDEX,PRIMARY KEY,FOREIGNKEY。
  • 数据库索引的分类:clustered Index,B/B+树的节点存放的就是一条条的记录;non-clustered index 存放的是记录的地址(存放的是指针)。
  • B树和B+树的区别:数据库的一条条数据记录可以出现在B树的非叶子节点上,数据库的数据只出现在B+树的非叶子节点上。
  • B树和二叉搜索树区别:B树每个结点有更多的元素和更多的儿子。
  • 为什么用B/B+树而不用二叉查找树?
    二叉树优化比较次数,B/B+树优化磁盘读写次数(磁盘的寻址加载次数)。由于 B 树的每一个节点,可以存放多个元素,所以磁盘寻址加载的次数会比较少。
    B+树和B树比起来更适合顺序访问,B+树叶子节点上有所有数据,非叶子节点只起到了索引的作用
  • m阶B/B+树
    每个非叶子节点(除根外)至多有m个儿子,至少有向上取整ceil(m/2)个儿子。根节点(如果不是叶子至少有两个儿子)。所有叶子节点在同一层。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值