【笔记】高并发:数据库优化方案

写在前面的

本文是在学习中所做的笔记,部分内容用自己的语言做了加工处理。如需学习原课程,可参考唐扬的《高并发系统设计40问》


数据库优化方案

一、池化技术

二、主从分离

  • 性能:单机4H8G MySQL5.7 tps:500 qps:10000
  • 实现步骤:
    • 主库:数据写入——更新binlog——创建log dump线程发送binlog
    • 从库:开IO线程接收主库数据——写入relay log——创建SQL线程读取relay log中的内容
  • 极端情况binlog丢失会造成主从数据不一致
  • 一般一个主库最多挂3-5个从库。
  • 如何解决主从延迟:
    • 数据冗余:发送消息队列时发送所处理的完整信息,避免再次查库。(优先考虑
    • 使用缓存:将写入主库的数据同步写入缓存中。
    • 查询主库:直接查主库。(不建议

三、分库分表

  • 为什么分库分表
    • 单表数据量过大会导致索引占用空间过大,影响查询性能。
    • 数据量增加占用的磁盘空间也增加,数据库备份和恢复的时间变长。
    • 不同模块数据存储在一个库中,当发生故障时所有模块都受影响,无法做到不同模块的故障隔离。
    • 单机的QPS和TPS是受限的,随着写入请求量的增长无法处理更高的并发写入请求。
  • 好处:数据分片可以分摊数据库的读写压力,突破单机存储瓶颈。
  • 垂直拆分:将一张表根据业务类型拆分到多个数据库中去。
  • 水平拆分:关注点在数据的特点。
    • 按照某一个字段的哈希值做拆分。比如用户ID,适用于实体表。
    • 按照某一个字段的区间值做拆分。比如创建时间,适用于列表。
      • 缺点:热点问题、需要提前建表
    • 水平拆分带来的问题:
      • 引入了分库分表键(分区键):建立其他字段和分区键的映射表,如昵称和ID。
      • 数据库特性实现起来会变得困难,如join操作:用其他形式代替。

你可能感兴趣的:(【笔记】高并发:数据库优化方案)