数据库

1 背景

面经总结第六篇–数据库。

下面的部分内容可能引用自其他师傅的文章,有的忘记引用了,侵删。

2 关系范式级别、事务的特性和事务并发操作引发的问题、封锁技术、和三级封锁协议

2.1 关系范式级别

1NF:表中的所有字段值都是不可分解的原子值
2NF:在1NF基础上满足非关键字段完全函数依赖于候选关键字段
3NF:在2NF基础上满足非关键字段不传递函数依赖于候选关键字段
BCNF:在3NF基础上消除候选关键字段对关键字段的部分和传递函数依赖

1NF是所有关系型数据库的最基本要求,实际环境常使用规范化理论分解成3NF,因为分解达到BCNF的算法能保证分解的无损连接性,但不一定能保证函数依赖保持,而分解达到3NF的算法既能保持无损连接又能保证函数依赖保持。

2.2 事务

事务的特性:ACID(原子性、一致性、隔离性、持久性)

事务并发操作引发的问题:丢失修改(写后写)、幻读(读写读)、读脏数据(写读回滚)

2.3 封锁技术

封锁技术:封锁是实现并发控制的一种机制,即事务T在对某个数据对象操作之前,先对其加锁。

共享锁(Share Lock):S锁,又称读锁,用于所有只读数据操作。
S锁并非独占,允许多个并发事务对同一资源加锁,但加S锁的同时不允许加X锁,即资源不能被修改。S锁通常读取结束后立即释放,无需等待事务结束。
排他锁(Exclusive Lock):X锁,又称写锁,表示对数据进行写操作。
X锁仅允许一个事务对同一资源加锁,且直到事务结束才释放,其他任何事务必须等到X锁被释放才能访问资源。

2.4 三级封锁协议

在运用X锁和S锁对数据对象加锁时,还需要约定一些规则,例如何时申请和释放X和S锁、持锁时间等,这些规则称为封锁协议。

① 一级封锁协议:事务T在修改数据R之前必须先对其加X锁,直到事务结束才释放。
② 二级封锁协议:一级封锁协议加上事务T在读取数据R之前必须先对其加S锁,读完后即可释放S锁。
③ 三级封锁协议:一级封锁协议加上事务T在读取数据R之前必须先对其加S锁,直到事务结束才释放。

3 MySQL的索引类型、B+树比B树更适合索引、Hash索引和B+树区别

3.1 MySQL的索引类型

数据结构维度:B+树索引(所有数据存储在叶子节点,复杂度为Olog(n),适合范围查询);哈希索引(适合等值查询)

物理存储维度:聚集索引(以主键创建的索引,叶子节点存储的是表中的数据);非聚集索引(以非主键创建的索引,叶子节点存储的是主键和索引列)

逻辑维度:
主键索引(一种特殊的唯一索引,不允许有空值)
普通索引(MySQL中基本索引类型,允许空值和重复值)
联合索引(多个字段创建的索引,使用时遵循最左前缀原则)
唯一索引(索引列中的值必须是唯一的,但是允许为空值)
空间索引(MySQL 5.7之后支持空间索引)

3.2 B+树比B树更适合索引

① B+树的磁盘读写代价更低:B+树的内部结点只存关键字不存数据,因而单个页可以存储更多的关键字,即一次性读入内存的关键字也就越多,磁盘的随机I/O读取次数相对就减少;
② B+树的查询效率更稳定:B+树的所有数据存储在叶子节点,查询复杂度为Olog(n),B树所有节点都存储数据,查询复杂度为O(1)~Olog(n);
③ B+树的查询效率更高:B+树叶子结点之间用链表有序连接,所以扫描全部数据只需扫描一遍叶子结点,而B树只能中序遍历所有节点,效率较低。

3.3 Hash索引和B+树区别

① B+树可以进行范围查询,Hash索引不能;
② B+树支持联合索引的最左侧原则,Hash索引不支持;
③ B+树支持order by排序,Hash索引不支持;
④ Hash索引在等值查询上比B+树效率更高,但是索引列的重复值很多的话引发Hash冲突导致效率降低;
⑤ B+树使用like进行模糊查询的时候,like后面(比如%开头)的话可以起到优化的作用,Hash索引根本无法进行模糊查询。

[1] https://zhuanlan.zhihu.com/p/626943538

4 SQL语句格式、大表数据查询优化、删除数据

4.1 SQL语句格式

4.2 大表数据查询优化

① 优化SQL查询语句,应尽量避免全表扫描
② 调整数据结构的设计,对于经常访问的数据库表建立索引
③ Redis主从复制、读写分离、加缓存
④ 调整硬盘I/O,DBA可以将组成同一个表中的数据文件放在不同的硬盘上,做到硬盘之间I/O负载均衡

4.3 删除数据

drop直接删除表
delete:删除表中部分数据,但需逐行删除,速度慢
truncate:删除表中全部数据,但保留表结构


转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达,可以邮件至 xingshuaikun@163.com。

×

喜欢就点赞,疼爱就打赏