面试题简答题——数据库相关汇总

1. 存储过程与函数的区别

视图是虚表,不存储数据,存储的是SQL语句,检索视图实际上是执行定义它的SQL语句,视图的定义,存放在数据字典中;视图的性能并没有想象中的出色,对视图请求无非就是执行了一句普通的select语句,然后以结果集构成视图;

存储过程是数据库中的程序,而不只是检索的SQL语句,它可以在不需要外部程序的情况下,使数据库自己解决复杂的、一般的SQL难以解决的问题;存储过程属于过程化SQL中的命名块,执行过程在创建时即在服务器上进行编译,编译后保存在数据库中,可以反复调用,所以执行速度比单个SQL语句快;

2. primary key约束 与 unique 约束的区别

1、一个表中只能定义一个primary key约束,但可以定义多个unique约束;
2、指定为primary key 的属性组,其中任何属性都不能取空值;而对于unique所约束的唯一键,则可以取空值,只不NULL值只能有一个;

3. 简述查询优化的步骤

各个关系系统的优化方法不尽相同,大致的步骤可以归纳如下:语法树->优化->底层存取路径->执行
(l)把查询转换成某种内部表示,通常用的内部表示是语法树;
(2)把语法树转换成标准(优化)形式,即利用优化算法,把原始的语法树转换成优化的形式;
(3)选择底层的存取路径;
(4)生成查询计划,选择代价最小的执行;

4. 数据库中常用的四种文件组织形式

1、顺序文件
2、索引文件
3、散列文件:基于散列(Hash)的分布存储方式,主要是依赖主要Key和散列算法;
4、倒排文件:通过记录的某一项属性值反过来查找到这个记录的存放地址,或者记录对应的关键码;这种索引即为倒排索引,拥有倒排索引的文件被称为倒排索引文件,简称倒排文件;

5. 为什么要对关系代数表达式进行优化

在关系模型中,存取路径对用户透明,虽然降低了开发人员开发应用程序的难度以及用户的操作难度,但会导致其查询效率不如格式化数据模型;比如,笛卡尔积、连接运算不仅费时,还产生大量的中间结果,效率低,所以要对关系代数哦表达式进行优化,这里就需要让选择、投影先执行;

启发式规则:
1、选择运算尽可能先做;
2、把投影运算和选择运算同时进行;
3、把投影同其前或后的双目运算结合起来;
4、把某些选择同在它前面要执行的笛卡尔积结合起来称为一个连接运算;
5、找出公共子表达式;

6.文件系统为什么会存在数据冗余?数据冗余会导致哪两类问题?

由于文件系统难于实现数据共享,且文件结构的设计基于某个特定的应用程序,文件之间缺乏连续,因此,相同的数据可能会在多个文件中重复出现,即产生数据冗余;
数据冗余会导致数据(更新)异常数据不一致性

7. 索引的左右?维护索引的代价

作用:
第一,通过创建唯一性索引,可以保证数据库表中每一行数据的唯一性。
第二,可以大大加快 数据的检索速度,这也是创建索引的最主要的原因。
第三,可以加快表和表之间的连接,特别是在实现数据的参考完整性方面特别有意义。
第四,在使用分组和排序子句进行数据检索时,可以显著减少查询中分组和排序的时间。
第五,通过使用索引,可以在查询的过程中,使用优化隐藏器,提高系统的性能。
代价:
第一,创建索引和维护索引要耗费时间,这种时间随着数据量的增加而增加。
第二,索引需要占物理空间,除了数据表占数据空间之外,每一个索引还要占一定的物理空间,如果要建立聚簇索引,那么需要的空间就会更大。
第三,当对表中的数据进行增加、删除和修改的时候,索引也要动态的维护,这样就降低了数据的维护速度。

8. WHERE 和 HAVING 的基本区别

WHERE 在分组和聚集计算之前选取输入行(它控制哪些行进入聚集计算);
而 HAVING 在分组和聚集之后选取分组后的组;

9. 什么是存储过程?有哪些优缺点?

存储过程可理解为编程语言中的函数,对代码进行封装;
优点:
1、封装代码;
2、可让编程语言进行调用;
3、存储过程是一个预编译的代码块,在服务器上编译后保存在数据库中,执行效率比较高;
4、一个存储过程代替大量T_SQL语句,可以降低网络通信量,提高通信速率;

//T-SQL 即 Transact-SQL,是 SQL 在 Microsoft SQL Server 上的增强版,它是用来让应用程序与 SQL Server 沟通的主要语言

缺点:
1、每个数据库的存储过程语法几乎都不一样,比较难以维护;
2、业务逻辑放在数据库上,难以迭代;

10. drop、delete和truncate

特点
drop table 属于DDL、不可回滚、不可带where、表内容和结构删除、删除速度快
truncate table 属于DDL、不可回滚、不可带where、表内容删除、删除速度快
delete from 属于DML、可回滚、可带where、表结构仍在、表内容要看where执行的情况、删除速度慢(逐行删除)

使用情况:
不需要一张表时,用DROP;
像删除部分数据行时,用delete,并带上where子句(条件);
保留表的定义而删除所有数据的时候用truncate;

11. 索引

一、索引的特点
1、定义primary key和unique约束后系统自动在相应的列上创建索引;
2、用户不必指定使用哪个索引;
3、用户也能按自己的需求,对指定单个(或多个)字段添加索引;

二、什么时候要创建索引?
1、表经常要select操作时;
2、表很大,记录很多,记录内容分布广时;
3、列名经常再where子句or连接条件中出现;

三、是么时候不要创建索引?
1、表经常进行INSERT/UPDATE/DELETE操作时;
2、表很小,记录很少;
3、列名不经常作为连接条件or出现在where子句中;

四、索引优缺点
1、索引加快数据库的检索速度
2、索引降低了插入、删除、修改等维护任务的速度(虽然索引可以提高查询速度,但是它们也会导致数据库系统更新数据的性能下降,因为大部分数据更新需要同时更新索引);
3、唯一索引可以确保每一行数据的唯一性,通过使用索引,可以在查询的过程中使用优化隐藏器,提高系统的性能
4、索引需要占物理空间

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

12. 事务隔离级别

数据库定义了4个隔离级别:

1、读未提交:Read uncommitted【级别最低,什么都避免不了】
即可以读到未提交的内容,因此,在这种隔离级别下,查询是不会加锁的,也由于查询的不加锁,所以这种隔离级别的一致性是最差的,可能会产生“脏读”、“不可重复读”、“幻读”;
如无特殊情况,基本是不会使用这种隔离级别的;

2、读提交:Read committed【可避免脏读】
即只能读到已经提交了的内容,是系统中最常用的一种隔离级别,也是SQL Server和Oracle的默认隔离级别;

3、可重复读:Repeatable read【可避免脏读,避免不可重复读】
事务A读取数据data=0,未提交;事务B修改数据data=1,提交;此时事务A再次读取数据data=0,依旧是一开始读取到的值;

4、串行化:Serializable【可避免脏读,避免不可重复读,避免幻读】
即事务一个个排队执行;

13. 乐观锁和悲观锁

引入:确保在多个事务同时存取数据库中同一数据时不破坏事务的隔离性和统一性以及数据库的统一性,乐观锁和悲观锁是并发控制主要采用的技术手段;

1、悲观锁:假定会发生并发冲突,屏蔽一切可能违反数据完整性的操作;
1)查询完数据的时候就把事务锁起来,直到提交事务;
2)实现方式:数据库中的锁机制;
2、乐观锁:假设不会发生并发冲突,直在提交操作前检查是否违反数据完整性;
1)修改数据时把事务锁起来,通过version的方式来进行锁定;
2)实现方式:使用version版本或者时间戳;

version版本指数据库中数据对象的一个快照,记录了数据对象在某个时刻的状态;能够提高系统并发度;
原理:事务T1先写数据A,事务T2想读数据A,若无版本控制,则T2必须等T1执行完才能执行;有了版本控制后,在事务T1准备写A时,为A建立快照,T2可以读A的快照,从而提高并发度,最后在T2准备提交时检查T1是否完成;若完成,T2放心提交,若未完成,等待直到T1完成;

**时间戳方法:**给每个事务盖上唯一的一个时标,即事务开始执行时间;若发生冲突,则回滚到较早时间戳的事务,以保证其他事务的正常秩序,被回滚的事务赋予新的时间戳并重新执行;

14. Mysql存储引擎

常用存储引擎有:
1、Innodb引擎:提供对数据库ACID事务支持,提供行级锁和外键的约束,设计目的是处理大数据容量的数据库系统;
2、MyIASM引擎:原来Mysql的默认引擎,不提供事务的支持,也不支持行级锁和外键;
3、MEMORY引擎:所有的数据都在内存中,数据的处理速度快,但是安全性不高;

同一个数据库也可以使用多种存储引擎的表;如果一个表修改要求比较高的表选择MyISAM存储。如果该数据库需要一个用于查询的临时表,可以选择MEMORY存储引擎;

MyIASM和Innodb两种引擎所使用的索引的数据结构都是B+树;
对于MyIASM引擎,B+树的数据结构中存储的内容实际上是实际数据的地址值;即索引和实际数据分开的,只不过使用索引指向实际数据,即非聚集索引;
Innodb引擎的数据结构中存储的都是实际的数据,即为聚集索引;

15. 嵌套SQL的处理方式

由内向外;
即在一个查询得到的结果集(子查询)之上再次进行查询,SQL在执行时,必须先得到子查询的结果,再把子查询的结果集当成表进行再次查询;

16.Redis和 mysql

1、类型上
从类型上来说,mysql是关系型数据库,redis是缓存数据库;

2、作用上
mysql用于持久化的存储数据到硬盘,功能强大,但是速度较慢;
redis用于存储使用较为频繁的数据到缓存中,读取速度快;

3、需求上
mysql和redis因为需求的不同,一般都是配合使用;

猜你喜欢

转载自blog.csdn.net/wyll19980812/article/details/106005205
今日推荐