数据库面试题

1.三大范式是什么,做简要说明。

参考:http://blog.csdn.net/tianya_team/article/details/50718011

第一范式:保证每列的原子性

如果每列(或者每个属性)都是不可再分的最小数据单元(也称为最小原子单元),则满足第一范式。

例如:顾客表(姓名、编号、地址、...)其中“地址”列还可以细分为国家、省、市、区等。

第二范式:在第一范式的基础上更进一层,目标是确保表中的每列都和主键相关。

如果一个关系满足第一范式,并且除了主键之外的其他列,都依赖该主键,则满足第二范式。

例如:订单表(订单编号、产品编号、订购日期、价格、...),”订单编号“为主键,”产品编号“不依赖主键列。

第三范式:在第二范式的基础上更进一层,目标是确保每列都和主键直接相关,而不是间接相关。

如果一个关系满足第二范式,并且除了主键之外的其它列都不依赖非主键列(没有传递依赖),则满足第三范式。

例如:员工表(工号、工种、定额),工种依赖工号,定额依赖工种,就是传递依赖。


2.事务的4个特性及含义。

事务是访问并可能更新各种数据项的一个程序执行单元。具有下面四个特性:

1)原子性(atomicity):事务中所有操作视为一个原子单元,即对于事务所进行的数据修改操作只能是完全提交或者完全回滚。

2)一致性(consistency):事务在完成前,必须使所有数据从一种一致性状态变更为另一种一致性状态,与原子性密切相关。

3)隔离性(isolation):一个事务中的操作语句所做的修改必须与其他事务所做的修改相隔离。(这种特性通过锁机制实现)

4)持久性(durability):一旦事务提交,其所做的修改就会永久保存到数据库中。


3.mysql中innodb和myisam这两者db引擎的区别(优缺点)。

1)innodb

优点:支持事务和行级锁(对一行加锁),崩溃后自动恢复,支持高并发。

能够检测到死锁的循环依赖,并立即返回一个错误。

(innodb处理死锁的方法是,将持有最少行级排他锁的事务进行回滚)

缺点:查询较myisam慢。

2)myisam

优点:查询快。

缺点:不支持事务和行级锁,支持表锁(对整张表加锁),崩溃后无法安全恢复。


4.mysql的4个隔离级别以及脏读和幻读是什么?

mysql标准定义了4中事务隔离级别:

1)READ UNCOMMITTED(未提交读):事务中的修改,即便没有提交,对其他事务也都是可见的。

事务可以读取未提交的数据,这称为脏读

2)READ COMMITTED(提交读(不可重复读)):一个事务从开始直到提交之前,所做的任何修改对其他事务都不可见。(大多系统的默认级别)

3)REPEATABLE READ(可重复读):解决了脏读的问题,保证在同一个事务中多次读取同一记录的结果是一致的,但无法解决幻读问题。

幻读:当某个事务在读取某个范围内的记录时,另外一个事务又在该范围内插入了新的几列数据,当之前的事务再次读取该范围的记录时,发现有几列数据是它先前没有的。

4)SERIALIZABLE(可串行化):强制事务串行执行,避免了幻读。在读取的每一行数据上都加锁,可能导致大量的超时和锁争用问题。



5.查询优化有哪些方法?

最简单的衡量查询开心的三个指标:响应时间、扫描的行数,返回的行数。

1)使用索引覆盖扫描,把所有需要用的列都放到索引中,这样存储引擎无需回表获取对英航就可以返回结果了。

2)改变库表结构,例如使用单独的汇总表。

3)重写这个复杂的查询,让MYSQL优化器能够以更优化的方法执行这个查询。


6.如何定位耗时过长的查询?

开启慢查询日志功能,分析慢sql来优化sql语句。

slow_query_log=1  #启用慢查询
slow_query_log_file=mysql.slow  #慢查询的存储位置
long_query_time=2  #指定慢查询的记录时间比如这里大于2s sql 会记录下来


7.视图的作用。

视图:由SELECT语句组成的查询定义的虚拟表,不存放任何数据。在使用SQL语句访问视图时,返回的数据从其他表中生成。

视图和表的区别:不能对视图创建触发器,不能使用DROP TABLE删除视图。

视图的作用:

1)视图能简化用户的操作:在使用查询时,可能要显示其他字段或关联其他表,如果频繁发生的话可以创建视图。

2)可以聚焦特定的数据:可能需要表中有关的列,其他列不需要,为此可以创建一个视图,只查看感兴趣的。

3)使基表中的数据有一定安全性:对一些关键的数据,通过视图给用户,不能直接对表操作。

4)可以合并分离的数据:将几个表合并到一个视图里。


8.索引的作用。

索引:是对数据库表中一列或多列的值进行排序的一种结构。MYSQL中,索引是在存储引擎层而不是服务器层实现的。

例如这样一个查询:select * from table1 where id=10000。如果没有索引,必须遍历整个表,直到ID等于10000的这一行被找到为止;有了索引之后(必须是在ID这一列上建立的索引),即可在索引中查找。由于索引是经过某种算法优化过的,因而查找次数要少的多。可见,索引是用来定位的。

作用:

1)打打减少了服务器需要扫描的数据量。

2)可以帮助服务器避免排序和临时表。

3)可以将随机I/O变为顺序I/O。


9.存储过程和函数的区别是什么?

存储过程和函数都可以理解成一系列SQL语句的集合。两者的区别是函数必须有返回值,而存储过程则没有。存储过程的参数类型远远多于函数参数类型。


10.使用存储过程和函数的优缺点。

优点:

1)存储过程和函数能够实现较快的执行速度,减少网络流量。

2)存储过程和函数允许标准组件式编程,提高了SQL语句的重用性、共享性和可移植性。

3)存储过程和函数可以作为一种安全机制来使用。

缺点:

1)编写比单句SQL复杂,需要用户具有更高的技能和丰富经验。

2)编写存储过程和函数时,需要创建这些数据库对象的权限。


11.游标的作用是什么?如何知道游标已经到了最后?

游标可以看做一种数据类型,可以用来遍历查询的结果集,相当于指针或者数组的下标。

注意:游标指向的对象都是存储在临时表中而不是实际查询到的数据,所以MYSQL游标总是只读的。

游标的作用是定位结果集的行。通过判断全局变量@@FETCH_STATUS可以判断是否到了最后。次变量不为0表示出错或到了最后。


12.触发器分为事前触发和事后触发,两者有何区别?语句级触发和行级触发有何区别?

触发器是一种特殊的存储过程,它的执行不是由程序调用,也不是手工执行,而是由事件(DELETE语句、INSERT语句、UPDATE语句)触发。

事前触发是指触发器在事件之前被执行,可以避免非法更新、插入或删除。事后触指触发器在事件之后执行。语句级触发器可以在语句执行前或后触发,而行级触发在触发器所影响的每一行触发一次。


13.聚类索引和非聚类索引的区别是什么?

聚类索引:正文(数据)本身就是按照一定的规则排序的目录(索引)。

非聚类索引:索引顺序与数据排列顺序无关的索引。


14.谈谈你对数据库索引的理解。

索引是根据数据库表中一列或多列的值进行排序的一种结构。索引类似于驻留内存中的数据结构(如二叉树、B树和哈希表),索引与这些数据结构的区别在于,索引的数据量比一次能够调入内存的数据量大。因此数据库索引是存放在磁盘上的,只有被访问的时候才有部分被调入到内存。当计算机被关闭时,驻留内存的数据将会丢失,但是数据库索引中的数据将会永久存在。

索引包含表或视图中一列或多列生成的键,这些键存储在一个结构(一般为B树)中。

如果索引大多是搜索空值,那没必要建立索引,因为空值没办法建立索引。

不该建索引的地方:访问比较少、值的范围很小(例如年龄、性别)、经常进行修改的。

表的行数比较小的话,没有必要建索引。


15.现在普通关系库里用到的数据结构是什么类型的数据结构?

B树吗?


16.索引的优缺点。

优点:
1)可以加快数据的检索速度。

2)通过创建唯一性索引,保证了数据库表中每一行的唯一性。

3)如果索引是有序的,在搜索某一范围时,可以很快给出结果,而不需要排序。

4)可以加速表与表之间的连接。

缺点:

1)时间:创建索引和维护索引需要时间,这种时间随数据量的增加而增加。

2)空间:创建索引需要占用物理空间,除了数据表占数据空间外,每一个索引还要占一定物理空间。聚类索引占用的空间更大。

3)维护难度:当对数据库表进行插入、删除、和修改的时候,索引也要动态维护,这就增加了对数据的维护难度。


17.索引的种类及特点。

1)主索引:是候选索引的特例,能唯一标识一条记录,只能由一个字段组成。一个表只能建立一个主索引。 
2)候选索引:也能唯一标识一条记录,但不一定只由一个字段组成,可以由两个或两个以上字段组成,一个表可以建立多个候选索引。 
3)普通索引:就没有任何限制了,不能唯一标识一条记录,可以任意建立,数量不限。建立普通索引的主要目的是为了加快查询速度和建立表之间的联系。 
4)唯一索引:已经淘汰不用了,它的唯一性是指索引项的唯一而不是字段值的唯一。


18.关系型数据库的特点。
所谓关系型数据库,是指采用了关系模型组织数据的数据库。简单来说,关系模型指的就是二维表格模型,而一个关系型数据库就是根据一个二维表格及其之间的联系组织组成的数据组织。
关系:可以理解为一张二维表,每一个关系都有一个关系名,就是通常说的表名。
元组:可以理解为二维表中的一行,在数据库中经常被称为记录。
属性:可以理解为二维表中的一列,在数据库中经常被称为字段。
域:属性的取值范围。
关键字:可以唯一识别元组,数据库中经常被称为主键,由一个或多个列组成。
优点:
1)容易理解:关系型数据库是非常贴近逻辑世界的一个概念,关系模型相对网状、层次等其他模型来说更容易理解。
2)使用方便:通用的SQL语言使得操作关系型数据库非常方便,程序员甚至数据管理员可以在逻辑层面操作数据库而不需要知道其底层实现。
3)易于维护:丰富的完整性(实体完整性、参照完整性、用户定义完整性)大大降低了数据冗余和数据不一致问题。
缺点:

复杂查询功能差,支持长事务能力差,数据类型表达能力差,环境应变能力差。

你可能感兴趣的:(数据库面试题)