面试题整理 -- 数据库篇

面试题整理 -- 数据库篇

数据库相关

关系模型理论

数据库设计三范式

  1. 第一范式(确保每列保持原子性)
    第一范式是最基本的范式。如果数据库表中的所有字段值都是不可分解的原子值,就说明该数据库表满足了第一范式。

  2. 第二范式(确保表中的每列都和主键相关)
    第二范式在第一范式的基础之上更进一层。第二范式需要确保数据库表中的每一列都和主键相关,而不能只与主键的某一部分相关(主要针对联合主键而言)。也就是说在一个数据库表中,一个表中只能保存一种数据,不可以把多种数据保存在同一张数据库表中。

  3. 第三范式(确保每列都和主键列直接相关,而不是间接相关)
    第三范式需要确保数据表中的每一列数据都和主键直接相关,而不能间接相关。

数据库设计三大范式


事务相关

Transaction有哪几种隔离级别?(Isolation Level)

事务隔离级别

1476262331800.jpg

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

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

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

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

MySQL事务隔离级别详解
参考链接

分布式事务

如何用消息系统避免分布式事务

乐观锁,悲观锁

  • 悲观锁(Pessimistic Lock), 顾名思义,就是很悲观,每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,这样别人想拿这个数据就会block直到它拿到锁。传统的关系型数据库里边就用到了很多这种锁机制,比如行锁,表锁等,读锁,写锁等,都是在做操作之前先上锁。

  • 乐观锁(Optimistic Lock), 顾名思义,就是很乐观,每次去拿数据的时候都认为别人不会修改,所以不会上锁,但是在更新的时候会判断一下在此期间别人有没有去更新这个数据,可以使用版本号等机制。乐观锁适用于多读的应用类型,这样可以提高吞吐量,像数据库如果提供类似于write_condition机制的其实都是提供的乐观锁。

两种锁各有优缺点,不可认为一种好于另一种,像乐观锁适用于写比较少的情况下,即冲突真的很少发生的时候,这样可以省去了锁的开销,加大了系统的整个吞吐量。但如果经常产生冲突,上层应用会不断的进行retry,这样反倒是降低了性能,所以这种情况下用悲观锁就比较合适。

乐观锁与悲观锁---解决并发问题

ORACLE或MYSQL题目

分页如何实现(Oracle,MySql)

Oracle

SELECT *
  FROM (SELECT ROWNUM AS rowno, t.*
          FROM emp t
         WHERE hire_date BETWEEN TO_DATE ('20060501', 'yyyymmdd')
                             AND TO_DATE ('20060731', 'yyyymmdd')
           AND ROWNUM <= 20) table_alias
 WHERE table_alias.rowno >= 10;

Mysql

select * from tableName where 条件 limit 当前页码*页面容量-1 , 页面容量

Mysql引擎

  1. ISAM

  2. MyISAM

  3. HEAP

  4. InnoDB

Mysql引擎

InnoDB和MyISAM的区别

MyISAM:默认类型,基于传统ISAM类型,ISAMIndexed Sequential Access Method (索引 顺序访问) 缩写,存储记录文件标准.与其存储引擎比较,MyISAM具检查修复表格数工具. MyISAM表格压缩,且支持全文搜索.事务安全,且支持外键事物滚造完全滚具原性执行量 SELECTMyISAM更选择
InnoDB:种类型事务安全.与BDB类型具相同特性,支持外键.InnoDB表格速度快.具比BDB丰富特性,需要事务安全存储引擎,建议使用.数据执行量INSERT或UPDATE,于性能面考虑应该使用InnoDB表, 于支持事物InnoDB类型表影响速度主要原AUTOCOMMIT默认设置打且程序没显式调用BEGIN 始事务导致每插入条都自Commit严重影响速度执行sql前调用begin条sql形事物(即使autocommit打 )提高性能

InnoDB支持行锁,MyISAM只支持表级锁
InnoDB有事务安全,MyISAM没有
InnoDB支持外键,MyISAM不支持

MySQL存储引擎中的MyISAM和InnoDB区别详解
MyISAM和InnoDB的区别

Mysql默认引擎

mysql-5.5.5之前默认MyISAM,之后是InnoDB

posted @ 2016-10-13 10:21  望贪狼  阅读(1107)  评论(0)    收藏  举报