职场面试题总结(26)---数据库三范式是什么、mysql中myisam与innodb的区别、MySQL中InnoDB支持的四种事务隔离级别

206 阅读5分钟

1、数据库三范式是什么?

(1)第一范式(1NF)

字段具有原子性,不可再分。(所有关系型数据库系统都满足第一范式数据库表中的字段都是单一属性的,不可再分)

(2)第二范式(2NF)

是在第一范式(1NF)的基础上建立起来的,即满足第二范式(2NF)必须先满足第一范式(1NF)。要求数据库表中的每个实例或行必须可以被惟一地区分。通常需要为表加上一个列,以存储各个实例的惟一标识。这个惟一属性列被称为主关键字或主键。

(3)满足第三范式(3NF)

必须先满足第二范式(2NF)。简而言之,第三范式(3NF)要求一个数据库表中不包含已在其它表中已包含的非主关键字信息。所以第三范式具有如下特征:

1)每一列只有一个值。

2)每一行都能区分。

3)每一个表都不包含其他表已经包含的非主关键字信息。

2、请简述常用的索引有哪些种类?

(1)普通索引:即针对数据库表创建索引。

(2)唯一索引:与普通索引类似,不同的就是:MySQL数据库索引列的值必须唯一,但允许有空值。

(3)主键索引:它是一种特殊的唯一索引,不允许有空值。一般是在建表的时候同时创建主键索引。

(4)组合索引:为了进一步榨取MySQL的效率,就要考虑建立组合索引。 即将数据库表中的多个字段联合起来作为一个组合索引。

3、mysql中myisam与innodb的区别?

(1)事务支持

1)MyISAM:强调的是性能,每次查询具有原子性其执行数度比InnoDB类型更快,但是不提供事务持。

2)InnoDB:提供事务支持事务,外部键等高级数据库功能。具有事务(commit)、回滚(rollback)和崩溃修复能力(crash recovery capabilities)的事务安全(transaction-safe(ACID compliant))型表。

(2)InnoDB支持行级锁,而MyISAM支持表级锁。

用户在操作MyISAM表时,select,update,delete,insert语句都会给表自动加锁,如果加锁以后的表满足insert并发的情况下,可以在表的尾部插入新的数据。

(3)InnoDB支持MVCC,而MyISAM不支持。

(4)InnoDB支持外键,而MyISAM不支持。

(5)表主键

MyISAM:允许没有在何索引和主键的表存在,索引都是保存行的地址。

InnoDB:如果没有设定主键或者非空唯一索引,就会自动生成一个6字节的主键(用户不可见),数据是主索引的一部分,附加索引保存的是主索引的值。

(6)InnoDB不支持全文索引,而MyISAM支持。

(7)可移植性、备份及恢复

MyISAM:数据是以文件的形式存储,所以在跨平台的数据转移中会很方便。在备份和恢复时可单独针对某个表进行操作。

InnoDB:免费的方案可以是拷贝数据文件、备份binlog,或者用mysqldump,在数据量达到几十G的时候就相对麻烦了。

(8)存储结构

MyISAM:每个MyISAM在磁盘上存储成三个文件。第一个文件的名字以表的名字开始,扩展名指出文件类型。.frm文件存储表定义。数据文件的扩展名为MYD(MYData)。索引文件的扩展名是.MYI(MYIndex)。

InnoDB:所有的表都保存在同一个数据文件中(也可能是多个文件,或者是独立的表空间文件),InnoDB表的大小只受限于操作系统文件的大小,一般为2GB。

4、MySQL中InnoDB支持的四种事务隔离级别名称,以及逐级之间的区别?

(1)Read Uncommitted(读取未提交内容)

在该隔离级别,所有事务都可以看到其他未提交事务的执行结果。本隔离级别很少用于实际应用,因为它的性能也不比其他级别好多少。读取未提交的数据,也被称之为脏读(Dirty Read)。

(2)Read Committed(读取提交内容)

这是大多数数据库系统的默认隔离级别(但不是MySQL默认的)。它满足了隔离的简单定义:一个事务只能看见已经提交事务所做的改变。这种隔离级别也支持所谓的不可重复读(Nonrepeatable Read),因为同一事务的其他实例在该实例处理其间可能会有新的commit,所以同一select可能返回不同结果。

(3)Repeatable Read(可重读)

这是MySQL的默认事务隔离级别,它确保同一事务的多个实例在并发读取数据时,会看到同样的数据行。不过理论上,这会导致另一个棘手的问题:幻读(PhantomRead)。简单的说,幻读指当用户读取某一范围的数据行时,另一个事务又在该范围内插入了新行,当用户再读取该范围的数据行时,会发现有新的“幻影”行。InnoDB和Falcon存储引擎通过多版本并发控制(MVCC,Multiversion Concurrency Control 间隙锁)机制解决了该问题。注:其实多版本只是解决不可重复读问题,而加上间隙锁(也就是它这里所谓的并发控制)才解决了幻读问题。

(4)Serializable(可串行化)

这是最高的隔离级别,它通过强制事务排序,使之不可能相互冲突,从而解决幻读问题。简言之,它是在每个读的数据行上加上共享锁。在这个级别,可能导致大量的超时现象和锁竞争。

5、MySQL中InnoDB引擎的行锁是通过加在什么上完成的?

InnoDB行锁是通过给索引上的索引项加锁来实现的,这一点MySQL与Oracle不同,后者是通过在数据块中对相应数据行加锁来实现的。InnoDB这种行锁实现特点意味着:只有通过索引条件检索数据,InnoDB才使用行级锁,否则,InnoDB将使用表锁!

6、MySQL 当记录不存在时insert,当记录存在时update,语句怎么写?

INSERT INTO table(a,b,c)VALUES(123)ON DUPLICATE KEY UPDATE C=C+1