「面试复习」「计算机基础」三、数据库

目录

(一)数据库基础

1)主键、超键、候选键、外键?

2)视图?

3)数据库事务的四个特性及含义?

4)事务的隔离级别?

5)安全性操作?

6)完整性约束?

7)数据库范式?

8)数据库索引?

9)drop, delete与truncate的区别?

10)存储过程、函数、触发器?

(二)MySQL

1)MySQL存储引擎?

2)表级锁和行级锁?

3)B-Tree和B+Tree

参考:

 


(一)数据库基础

1)主键、超键、候选键、外键?

  • 超键(super key): 在关系中能唯一标识元组的属性集称为关系模式的超键
  • 候选键(candidate key): 不含有多余属性的超键称为候选键。也就是在候选键中,若再删除属性,就不是键了!
  • 主键(primary key): 用户选作元组标识的一个候选键程序主键
  • 外键(foreign key):如果关系模式R中属性K是其它模式的主键,那么k在模式R中称为外键。

主键为候选键的子集,候选键为超键的子集,而外键的确定是相对于主键的。

2)视图?

视图是虚拟的表,与包含数据的表不一样,视图只包含使用时动态检索数据的查询;不包含任何列或数据。使用视图可以简化复杂的sql操作,隐藏具体的细节,保护数据;视图创建后,可以使用与表相同的方式利用它们。

视图不能被索引,也不能有关联的触发器或默认值,如果视图本身内有order by 则对视图再次order by将被覆盖。

创建视图?

create view XXX as XXXXXXXXXXXXXX;

视图可以更改吗?

对于某些视图比如未使用联结子查询分组聚集函数Distinct Union等,是可以对其更新的,对视图的更新将对基表进行更新;但是视图主要用于简化检索,保护数据,并不用于更新,而且大部分视图都不可以更新。

3)数据库事务的四个特性及含义?

数据库事务transanction正确执行的四个基本要素:ACID。

原子性(Atomicity)、一致性(Correspondence)、隔离性(Isolation)、持久性(Durability)。

  • 原子性: 事务作为一个整体被执行 ,要么全部执行,要么全部不执行
  • 一致性: 保证数据库状态从一个一致状态转变为另一个一致状态
  • 隔离性: 多个事务并发执行时,一个事务的执行不应影响其他事务的执行
  • 持久性: 一个事务一旦提交,对数据库的修改应该永久保存

4)事务的隔离级别?

隔离级别决定了一个session中的事务可能对另一个session中的事务的影响。分别是:

  • 读未提交(READ UNCOMMITTED):最低级别的隔离,通常又称为dirty read,它允许一个事务读取另一个事务还没 commit 的数据,这样可能会提高性能,但是会导致脏读问题;
  • 读已提交(READ COMMITTED):在一个事务中只允许对其它事务已经 commit 的记录可见,该隔离级别不能避免不可重复读问题;
  • 可重复读(REPEATABLE READ):在一个事务开始后,其他事务对数据库的修改在本事务中不可见,直到本事务 commit 或 rollback。但是,其他事务的 insert/delete 操作对该事务是可见的,也就是说,该隔离级别并不能避免幻读问题。在一个事务中重复 select 的结果一样,除非本事务中 update 数据库。
  • 序列化(SERIALIZABLE):最高级别的隔离,只允许事务串行执行。
事务的并发问题?
 
  • 丢失更新:一个事务的更新覆盖了另一个事务的更新;
  • 脏读:一个事务读取了另一个事务未提交的数据;
  • 不可重复读:不可重复读的重点是修改,同样条件下两次读取结果不同,也就是说,被读取的数据可以被其它事务修改;
  • 幻读:幻读的重点在于新增或者删除,同样条件下两次读出来的记录数不一样。
隔离级别解决的并发问题?
 
脏读
不可重复读
幻读
读未提交RU
☑️
☑️
☑️
读已提交RC
✖️
☑️
☑️
可重复读RR
✖️
✖️
☑️
可串行化Serializable
✖️
✖️
✖️

5)安全性操作?

  • 授权:grant 权限(列) on 表名 to 用户
  • 所有权限:all priviliges
  • 收回权限:revoke 权限(列) on 表名 from 用户

6)完整性约束?

  • 主键约束:primary key
  • 外键约束:foreign key
  • 唯一约束:unique
  • 检查约束:check
  • 非空约束:not null

7)数据库范式?

第一范式(1NF):列不可分
无重复列,每一列都为不可分割的基本数据项。

第二范式(2NF):消除非主属性对码的部分函数依赖
属性完全依赖于主键,指不能存在仅依赖主关键字一部分的属性。

第三范式(3NF):消除非主属性对码的传递函数依赖
属性不依赖于其他非主属性,不能存在非主属性对于码的传递函数依赖。

第一范式

如果一个关系模式R的所有属性都是不可分的基本数据项,则R∈1NF(即R符合第一范式)。

一、每个字段都只能存放单一值

\

课程有两个值,不符合第一范式,可改为如下

\

二、每笔记录都要能利用一个惟一的主键来加以识别

\

这里出现了重复组,同样不满足第一范式,因为缺乏唯一标识码,可改为

\

第二范式 

若关系模式R∈1NF(即R符合第一范式),并且每一个非主属性都完全依赖于R的码,则R∈2NF(即R符合第二范式)。

\

这里表的码为(学号,课程),即知道这两项可以确定系名、宿舍、分数,或者是这三项依赖于前两项,可知:

  • 分数完全依赖(学号,课程);
  • 系名部分依赖(学号,课程),即知道学号或者课程就能确定系名;
  • 宿舍楼部分依赖(学号,课程),即知道学号或者课程就能确定宿舍楼;

由于非主属性系名,宿舍楼不完全依赖与码,不符合第二范式,可改为

第三范式

若关系模式R∈3NF(即R符合第三范式),则每一个非主属性既不部分依赖于码也不传递依赖于码。

\

上面的表2不符合第三范式,这是因为你知道了系名,同样也就知道了宿舍楼,称宿舍楼传递依赖于码(学号),可分解为

\

8)数据库索引?

什么是索引?

索引是对数据库表中一个或多个列的值进行排序的数据结构,以协助快速查询、更新数据库表中数据。

也可以这样理解:索引就是加快检索表中数据的方法。数据库的索引类似于书籍的索引。在书籍中,索引允许用户不必翻阅完整个书就能迅速地找到所需要的信息。在数据库中,索引也允许数据库程序迅速地找到表中的数据,而不必扫描整个数据库。

底层数据结构是什么?

底层数据结构是B+树

在数据结构中,我们最为常见的搜索结构就是二叉搜索树和AVL树(高度平衡的二叉搜索树,为了提高二叉搜索树的效率,减少树的平均搜索长度)了。然而,无论二叉搜索树还是AVL树,当数据量比较大时,都会由于树的深度过大而造成I/O读写过于频繁,进而导致查询效率低下,因此对于索引而言,多叉树结构成为不二选择。特别地,B-Tree的各种操作能使B树保持较低的高度,从而保证高效的查找效率。

为什么使用B+树这种数据结构?

查找速度快、效率高,在查找的过程中,每次都能抛弃掉一部分节点,减少遍历个数。

索引的分类?

  • 唯一索引:唯一索引不允许两行具有相同的索引值
  • 主键索引:为表定义一个主键将自动创建主键索引,主键索引是唯一索引的特殊类型。主键索引要求主键中的每个值是唯一的,并且不能为空
  • 聚集索引(Clustered):表中各行的物理顺序与键值的逻辑(索引)顺序相同,每个表只能有一个
  • 非聚集索引(Non-clustered):非聚集索引指定表的逻辑顺序。数据存储在一个位置,索引存储在另一个位置,索引中包含指向数据存储位置的指针。可以有多个,小于249个

索引的优缺点?

(1)优点:

  • 大大加快数据的检索速度,这也是创建索引的最主要的原因。
  • 加速表和表之间的连接。
  • 在使用分组和排序子句进行数据检索时,同样可以显著减少查询中分组和排序的时间。
  • 通过创建唯一性索引,可以保证数据库表中每一行数据的唯一性。

(2)缺点:

  • 时间方面:创建索引和维护索引要耗费时间,具体地,当对表中的数据进行增加、删除和修改的时候,索引也要动态的维护,这样就降低了数据的维护速度。
  • 空间方面:索引需要占物理空间。

什么样的字段适合创建索引?

  • 经常作查询选择的字段
  • 经常作表连接的字段
  • 经常出现在order by, group by, distinct 后面的字段

创建索引时需要注意什么?

  • 非空字段:应该指定列为NOT NULL,除非你想存储NULL。在mysql中,含有空值的列很难进行查询优化,因为它们使得索引、索引的统计信息以及比较运算更加复杂。你应该用0、一个特殊的值或者一个空串代替空值。
  • 取值离散大的字段:(变量各个取值之间的差异程度)的列放到联合索引的前面,可以通过count()函数查看字段的差异值,返回值越大说明字段的唯一值越多字段的离散程度高。
  • 索引字段越小越好:数据库的数据存储以页为单位一页存储的数据越多一次IO操作获取的数据越大效率越高。

9)drop, delete与truncate的区别?

  • drop直接删掉表
  • truncate删除表中数据,再插入时自增长id又从1开始
  • delete删除表中数据,可以加where字句

具体来讲:

DELETE语句执行删除的过程是每次从表中删除一行,并且同时将该行的删除操作作为事务记录在日志中保存以便进行进行回滚操作。TRUNCATE TABLE 则一次性地从表中删除所有的数据并不把单独的删除操作记录记入日志保存,删除行是不能恢复的,并且在删除的过程中不会激活与表有关的删除触发器。执行速度快。

表和索引所占空间。当表被TRUNCATE 后,这个表和索引所占用的空间会恢复到初始大小,而DELETE操作不会减少表或索引所占用的空间。drop语句将表所占用的空间全释放掉。

一般而言,drop > truncate > delete。TRUNCATE 和DELETE只删除数据,而DROP则删除整个表(结构和数据)。

应用范围。TRUNCATE 只能对TABLE;DELETE可以是table和view

10)存储过程、函数、触发器?

存储过程就像是编程语言中的函数一样,封装了我们的代码(PLSQL,T-SQL)

-------------创建名为GetUserAccount的存储过程----------------
create Procedure GetUserAccount
as
select * from UserAccount
go
-------------执行上面的存储过程----------------
exec GetUserAccount

存储过程(procedure)和函数(function)的区别?

本质上它们都是存储程序。

  • 函数只能通过return语句返回单个值或表对象;而存储过程不允许执行return语句,但是可以通过output参数返回多个值。
  • 函数限制比较多,不能用临时变量,只能用表变量,还有一些函数都不可用等等;而存储过程的限制相对就比较少。
  • 函数可以嵌入在SQL语句中使用,可以在select语句中作为查询语句的一个部分调用;而存储过程一般是作为一个独立的部分来执行。

存储过程(procedure)和触发器的区别?

触发器与存储过程非常相似,触发器也是SQL语句集,两者唯一的区别是触发器不能用EXECUTE语句调用,而是在用户执行Transact-SQL语句时自动触发(激活)执行。

触发器是在一个修改了指定表中的数据时执行的存储过程。

通常通过创建触发器来强制实现不同表中的逻辑相关数据的引用完整性和一致性。由于用户不能绕过触发器,所以可以用它来强制实施复杂的业务规则,以确保数据的完整性。

  • 触发器主要是通过事件执行触发而被执行的
  • 存储过程可以通过存储过程名称名字直接调用

当对某一表进行诸如UPDATE、INSERT、DELETE这些操作时,SQLSERVER就会自动执行触发器所定义的SQL语句,从而确保对数据的处理必须符合这些SQL语句所定义的规则。

存储过程的优点?

  • 能够将代码封装起来
  • 保存在数据库之中
  • 让编程语言进行调用
  • 存储过程是一个预编译的代码块,执行效率比较高
  • 一个存储过程替代大量T_SQL语句 ,可以降低网络通信量,提高通信速率

存储过程的缺点?

  • 每个数据库的存储过程语法几乎都不一样,难以维护
  • 业务逻辑放在数据库上,难以迭代

(二)MySQL

1)MySQL存储引擎?

  • MyISAM(MySQL5.5版之前的默认引擎)
  • InnoDB(MySQL5.5版之后的默认引擎)

MyISAM

  • 不支持行锁(MyISAM只有表锁),读取时对需要读到的所有表加锁,写入时则对表加排他锁;
  • 不支持事务
  • 不支持外键
  • 不支持崩溃后的安全恢复
  • 在表有读取查询的同时,支持往表中插入新纪录
  • 支持BLOB和TEXT的前500个字符索引,支持全文索引
  • 支持延迟更新索引,极大地提升了写入性能
  • 对于不会进行修改的表,支持 压缩表 ,极大地减少了磁盘空间的占用

InnoDB

  • 支持行锁,采用MVCC来支持高并发,有可能死锁
  • 支持事务(Transaction)
  • 支持外键
  • 支持崩溃后的安全恢复
  • 不支持全文索引

MyISAM与InnoDB常见对比:

  • count运算上的区别: 因为MyISAM缓存有表meta-data(行数等),因此在做COUNT(*)时对于一个结构很好的查询是不需要消耗多少资源的。而对于InnoDB来说,则没有这种缓存。
  • 是否支持事务和崩溃后的安全恢复: MyISAM 强调的是性能,每次查询具有原子性,其执行数度比InnoDB类型更快,但是不提供事务支持。但是InnoDB 提供事务支持事务,外部键等高级数据库功能。 具有事务(commit)、回滚(rollback)和崩溃修复能力(crash recovery capabilities)的事务安全(transaction-safe (ACID compliant))型表。
  • 是否支持外键: MyISAM不支持,而InnoDB支持。

MyISAM更适合读密集的表,而InnoDB更适合写密集的的表。

2)表级锁和行级锁?

  • 表级锁:每次操作锁住整张表。开销小,加锁快;不会出现死锁;锁定粒度大,发生锁冲突的概率最高,并发度最低;
  • 行级锁:每次操作锁住一行数据。开销大,加锁慢;会出现死锁;锁定粒度最小,发生锁冲突的概率最低,并发度也最高;

3)B-Tree和B+Tree

B-Tree

B+Tree

B-Tree和B+Tree的区别:

  1. 非叶子结点的子树指针与关键字个数相同;
  2. 非叶子结点的子树指针P[i],指向关键字值属于[K[i], K[i+1])的子树(B-树是开区间);
  3. 为所有叶子结点增加一个链指针;
  4. 所有关键字都在叶子结点出现;
  5. 内节点不存储data,只存储key;

B+的特性:

  1. 所有关键字都出现在叶子结点的链表中(稠密索引),且链表中的关键字恰好是有序的;
  2. 不可能在非叶子结点命中;
  3. 非叶子结点相当于是叶子结点的索引(稀疏索引),叶子结点相当于是存储(关键字)数据的数据层;
  4. 更适合文件索引系统;

 

 

 

参考:

https://www.jianshu.com/p/71927a377dc6

https://www.cnblogs.com/ktao/p/7775100.html

https://juejin.im/post/5b1685bef265da6e5c3c1c34

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值