数据库三大范式
- 原子性,字段不可再分割
- 完全依赖,没有部分依赖
- 没有传递依赖
事务四大特性
-
原子性:事务是一个最小单位,要么都完成,要么都不完成
-
一致性:事务提交前后保持一致
-
隔离性:当发生并发访问数据库时,相互之间不能被干扰,需要进行隔离
-
持久性:事务一旦提交时永久保存
事务的隔离级别
- 读未提交:可以读取未提交的数据
- 读已提交:能读到已提交的数据
- 可重复读:在并发读取数据时,看到同样的数据
- 串行化:一个事务执行完才能执行下一个事务
事务的传播
-
REQUIRED:如果当前没有事务,就新建一个事务,如果已经存在一个事务中,就加入到这个事务中。这是默认的选择。
-
SUPPORTS:支持当前事务,如果当前没有事务,就以非事务方式执行。
-
MANDATORY:使用当前的事务,如果当前没有事务,就抛出异常。
-
REQUIRES_NEW:新建事务,如果当前存在事务,把当前事务挂起。
-
NOT_SUPPORTED:以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。
-
NEVER:以非事务方式执行,如果当前存在事务,则抛出异常。
-
NESTED:如果当前存在事务,则在嵌套事务内执行。
MySQL和Oracle的区别
类型 | MySQL | Oracle |
---|---|---|
开源 | 收费 | |
自动增长 | 有自动增长类型 | 创建序列的方式 |
提交事务 | 默认自动提交 | 需要手动提交 |
锁 | 表级锁为主 | 行级锁 |
日期类型 | date、dateTime | date |
内存占有 | 较小 | 较大 |
字符串使用 | 单引号,双引号 | 单引号 |
分页 | linit | rownum( 只能小于,不能大于) |
判断真假 | 0,1 | true,false |
简单介绍下(我)常用搜索引擎
InnoDB聚集索引:数据文件是和索引绑在一起的,必须要有主键,通过主键索引效率很高。但是辅助索引需要两次查询,先查询到主键,然后再通过主键查询到数据。因此,主键不应该过大,因为主键太大,其他索引也都会很大。
MyISAM是非聚集索引:数据文件是分离的,索引保存的是数据文件的指针。主键索引和辅助索引是独立的。
InnoDB引擎和MyISAM引擎的区别
InnoDB(MySQL默认) | MyISAM | |
---|---|---|
事务 | 支持事务 | 不支持事务 |
锁 | 行锁 | 表锁 |
索引 | 没有索引,就自动生成6字节的主键(用户不可见 | 允许没有索引 |
全文索引 | 不支持 | 支持 |
外键 | 支持 | 不支持 |
FULLTEXT类型 | 不支持 | 支持 |
聚集索引 | 是( 必须要有主键 | 非 |
数据库的锁
-
表锁:开销小,加锁快;不会出现死锁;锁定力度大,发生锁冲突概率高,并发度最低
-
行锁:开销大,加锁慢;会出现死锁;锁定粒度小,发生锁冲突的概率低,并发度高
-
页锁:开销和加锁速度介于表锁和行锁之间;会出现死锁;锁定粒度介于表锁和行锁之间,并发度一般
-
悲观锁:假定会发生并发冲突,屏蔽一切可能违反数据完整性的操作
-
乐观锁:假定不会发生并发冲突,只在提交操作时检查是否违反数据完整性
-
共享锁(S):允许一个事务去读一行,阻止其他事务获得相同数据集的排他锁。
-
排他锁(X):允许获得排他锁的事务更新数据,阻止其他事务取得相同数据集的共享读锁和排他写锁。
共享锁和排他锁都是行锁,意向锁都是表锁,应用中我们只会使用到共享锁和排他锁,意向锁是mysql内部使用的,不需要用户干预。
-
意向共享锁(IS):事务打算给数据行加行共享锁,事务在给一个数据行加共享锁前必须先取得该表的IS锁。
-
意向排他锁(IX):事务打算给数据行加行排他锁,事务在给一个数据行加排他锁前必须先取得该表的IX锁。
好啦好啦,简单分享一些面试中用到的,下次来一波数据库优化~
拜拜