数据库的三大范式
第一范式
:每个列都不可以再拆分第二范式
:在第一范式的基础上,非主键列完全依赖于主键第三范式
:在第二范式上,非主键列只依赖主键,不依赖其他非主键
事务的并发问题
脏读
:事务A读取了事务B更新的数据,然后数据B回滚,那么A读到的是脏数据不可重复读
:事务A多次读取同一数据,事务B在事务A读取的过程中对数据进行了修改并提交,导致A多次读的数据不一样幻读
:事务A读取数据的时候,事务B增添了数据,导致A读完后发现还有数据没读- 不可重复读侧重于修改,幻读侧重于新增或删除
- 解决不可重复读只需要锁行,而解决幻读需要锁表
事务的隔离级别
事务隔离级别 | 脏读 | 不可重复读 |
---|---|---|
读未提交 | 是 | 是 |
不可重复读 | 否 | 是 |
可重复读 | 否 | 否 |
串行化 | 否 | 否 |
b-tree、b+tree的区别
- b-tree的关键字、索引和记录是放在一起的
- b+tree的记录只放在叶子节点中,而非叶子节点中只有关键字和指向下一个节点的索引
- b-tree中越靠近根节点的记录查找事件越快,只要找到关键字即可确定记录的存在
- b+tree中每个记录的查找事件基本一样,都需要从根节点走到叶子节点
- b+tree的磁盘读写代价更低,查询效率更加稳定,b+tree更适合建索引
drop、delete、truncate的区别
- 不需要再用一张表时直接用drop删除
- 删除所有数据,但是保留表结构用truncate
- 想删除部分数据的时候用delete
union和union all的区别
- union会多获取的数据进行去重和排序
- union all会保留所有查询结果,并不会进行去重和排序
- 在不去重的前提下,union all的效率要高一些
char和varchar的区别
- char,定长,固定长度的字符串推荐使用char类型存储,节省空间且效率高
- varchar,不定长,效率低
字段为什么要定义成not null
- null值会占用更多的字节,且会在程序中造成很多不符合预期的情况