目录
1、规范化与逆规范化
2、数据库视图
3、数据库索引
4、SQL优化
5、数据库分区
6、分布式数据库
7、NoSql
8、读写分离(主从复制)
9、缓存一致性
10、云数据库
11、主题数据库
12、数据同步
1、规范化与逆规范化
规范化:
优点:
- 解决数据库中数据的插入、删除、修改异常等问题
- 减少数据冗余
- 确保数据的一致性和完整性
- 提高数据安全性
缺点:
- 可能由于拆分的表过多,从而导致查询性能较低
- 连接查询较多,增加sql复杂性
技术手段:
- 第一范式 :属性不可再分
- 第二范式:消除非主属性对候选键的部分依赖
- 第三范式:消除非属性对候选键的传递依赖
- BC范式:每个依赖的左侧决定因素都包含某个候选键
逆规范化:
优点:
- 增加了冗余列,使得查询sql简化,增加了查询效率
- 增加了派生列,提搞了统计效率
缺点:
- 数据冗余可能导致在插入、更新,删除时,数据不一致问题
- 冗余数据,会消耗额外的存储空间
- 更新数据时,需要同时更新冗余数据,会降低操作效率
- 增加程序复杂性,需要编写复杂的数据同步程序来同步冗余数据
缺点解决方案:
数据不一致问题解决方案:
- 触发器数据同步
- 应用程序数据同步
技术手段:
- 增加冗余列:常用于减少连接查询
- 增加派生列:常用于减少计算,比如,订单中商品数量和单价存在,派生出订单总价字段
- 水平分割表:根据某个属性值按照一定规则(散列、取余)进行水平分割数据记录到相同结构的多张表
- 垂直分割表:将主键与表中的部分列作为一个表,主键与其他列最为另一张表
- 重新组表:将拆分过度的表重新组合为一张表
2、数据库视图
优点:
- 视图能简化用户操作
- 对数据库重构提供了一定的逻辑独立性,数据库修改表结构,视图使用者,无需修改
- 保护数据的机密性,比如用户表中有身份证,手机号信息,但我们指向对外提供用户名和邮箱,可以创建一个用户名和邮箱的视图
- 灵活的控制数据的可见性,可以提供不同视图供不同的用户使用
物化视图:将视图的内容存储起来,随原始表数据发生变化,同步更新
3、数据库索引
优点:提高查询效率
缺点:降低数据修改、删除效率、需要额外的空间存储索引文件
过多索引问题:
- 过多索引会占用大量的存储空间
- 更新语句会引发索引更新,降低更新操作效率
- 会导致查询优化器压力增加,评估的组合增多
- 聚集索引更新会导致非聚集索引同步更新,降低了处理效率
索引使用建议
1、需要对建立的索引进行实际的测试,因为索引的使用是数据库优化器决定的。
其他点,围绕“过多索引问题”进行罗列
4、SQL优化
- 建立物化视图,避免多表连接查询
- 查询时,只查询需要的属性列
- 对常用的查询列建立索引
- 以不相干的子查询替代相干子查询
- 经常提交COMMIT ,尽早释放锁
- 用带in的条件子句等价替换OR 子句
5、数据库分区
分区是数据库管理中的一种技术,指的是将一张表或索引按照某种规则水平切分为多个物理部分。虽然逻辑上表仍然是整体,但在存储层面,这些分区是独立的。每个分区可以单独存储在不同的磁盘或节点上。
分区类型:
- 范围分区(RANGE):根据数据范围值来做分区,例如:按用户年龄分区,0~18分区a,18~60 分区b
- 散列分区(HASH):通过对key进行hash运算分区,例如:类似于取余操作,把余数相同的放在一个分区
- 列分区(LIST):根据某字段的具体值进行分区,例如:用户归属地,长沙用户分为一个区,上海用户分为一个分区
优点:
- 查询优化:通过分区键值,减少扫描的数据量。
- 管理灵活:分区级别的数据操作更加高效,例如删除或归档。
- 支持扩展:方便将数据分布到多个节点或存储设备上。
- 提升并发:减少锁争用,提高多线程处理效率。
缺点:
- 设计复杂性:分区表的设计需要提前规划分区键和分区规则,且后续修改代价较高。
- 查询限制:某些查询可能无法利用分区优化(如未使用分区键)。
- 功能限制:部分数据库功能(如外键约束)在分区表中可能不支持。
- 存储开销:每个分区都会占用额外的元数据存储。
6、分布式数据库
分布式数据库特点:
- 自治性:每个数据节点都有独立的DBMS,节点之间没有主从关系
- 分布性:各节点数据可以存储在不同位置,不同设备上
- 透明性:用户不关心数据的存储位置、复制方式、数据模型。
- 可用性:部分节点故障,其他节点副本仍然可以正常对外提供服务
透明性:
- 位置透明:不关心数据存储在什么位置
- 逻辑透明(局部映射透明):用户不关心局部DBMS使用何种数据模型,哪种语言
- 复制透明:不关心副本数据使用何种方式,何时进行数据同步
- 分片透明:不关心各节点使用何种分片方式(水平分片、垂直分片、混合分片、导出分片)
分片方式:
- 水平分片:按照数据记录分片
- 垂直分片:按照属性列分片
- 混合分片:(水平 + 垂直)
- 导出分片:一个关系的分片不是基于关系本身的属性,而是根据另一个与其有关联的关系的属性来划分。例如 :有两张表“课程表”(课程名,课程号,学号)、“学生表”(学号,姓名,性别),此时根据性别进行水平分片,就叫做导出分片
7、NoSql
1、键值数据(key-value):每条记录以字符串作为key, 值可以是任意类型数据,例如: redis
优点:扩展性好,灵活性高,大量写操作时性能高
缺点:无法存储结构化数据,条件查询效率低
2、列式数据库:以列为单位组织数据,每一列都有一个相关的列式存储文件,例如:Hbase
优点:查找速度快,可扩展性强,更容易进行分布式扩展
缺点:不支持强数据一致性,对修改操作较慢
3、文档数据库:以键值来定位一个文档,可以看作是键值数据库的衍生品,主要用来存储半结构化和非结构化数据,例如:mongoDB
优点:数据结构灵活,复杂性低
缺点:查询性能不高,缺乏统一的查询语法
4、图形数据库(Graph):使用灵活的图形模型,专门处理高度关联关系的数据,例如:Neo4J, InfoGrid
优点:灵活性高,支持复杂的图形算法,可用于构件复杂的关系图谱
缺点:复杂性高,分布式集群较复杂
8、读写分离(主从复制)
简述优点:
- 提高数据库可用性:主数据库故障宕机时,会在从数据库里选举一个作为新的主数据库,从而提高了数据库的可用性。
- 提升数据库处理效率:主数据库处理数据更新操作,将查询操作分发给从数据库,从而减少主数据库的处理压力,提高数据库处理性能。
简述数据库主从复制流程
- 当从库启动复制时,创建I/O线程连接主库
- 主库随后创建Binlog Dump线程读取数据库事件,发送给I/O线程
- I/O线程接收到事件数据后,更新到从库的中继日志Relay Log 中
- 从库的SQL线程读取中继日志Relay Log中的更新数据库事件并应用
简述"同步复制",”异步复制“,半同步复制三种复制方式的特点
- 同步复制,主库需要等待所有从库同步成功才可以响应用户,影响用户体验,这种方式保证了数据一致性,但是牺牲了数据的可用性
- 异步复制:当用户请求更新数据时,主库更新成功后直接响应,异步将更新事件发送给从库,不会等待从库是否完成同步,这种方式保证了主数据库的可用性,但牺牲了数据的一致性。
- 半同步复制:用户请求更新数据,主库执行更新操作,同步发送数据库事件给从库,但主库不用等待所有从库同步成功便可响应用户,也就是说主库可以等待部分从库同步成功后,响应用户操作成功。
9、缓存一致性
简述数据库缓存同步过程
读操作:
- 根据key先从缓存中读取
- 缓存读取不到,则从数据库中查询数据,将查到的数据添加到缓存中,返回数据
- 缓存读取到,直接将数据返回
写操作:
- 数据库更新数据,同步将缓存中的数据更新/删除,返回成功
简述redis存储方案:
1、主从复制模式:主节点负责写操作,从节点复制主节点数据,负责读操作
- 优点:实现了读写分离,可以提高读操作的性能;通过从节点复制主节点的数据,提高了数据可用性
- 缺点:主节点仍然存在单点故障问题,故障转移需要手动进行
- 使用场景:读写分离,数据备份
2、哨兵模式:主从模式上增加了哨兵(sentinel)进程,用于监控主从节点的状态,并在主节点故障时,自动进行故障转移
- 优点:提供了自动故障转移功能,提高了系统的可用性,可以监控多个redis节点的健康状态
- 缺点:配置相对复杂,故障转移时可能导致短暂的服务中断
- 适用场景:高可用
3、集群模式:分布式部署方式,数据被分割成多个片段,分布在不同节点上,每个节点可以是主节点也可以是从节点,节点相互协调,共同提供服务
- 优点:分布式存储,提高可存储容量和处理能力,自动进行故障转移,提高了系统可用性,支持动态扩容
- 缺点:配置和运维复杂,不支持跨界点的事务和某些复杂操作
- 适用场景:水平扩展,高并发、高可用
4、单机模式:
- 优点:配置简单、操作节点
- 缺点:单点故障