跳至主要內容

(2)数据库设计


1.每天存储一亿条数据记录,数据库怎么设计?

一天秒数:606024=86,400秒,每天写入数据量:100,000,000条,平均每秒写入数据量:100,000,000/86,400=1157.5条,峰值每秒估算写入数:1157.5*10=11575条。

数据库设计方案:

  • 数据库服务器磁盘采用高速SSD磁盘。
  • 数据库采用2个节点的集群方式部署,每个集群节点3台服务器,1主2备,主数据库为写数据库,备数据库为读数据,采用读写分离,单集群节点内主备库数据实时同步,集群节点主库数据实时同步。
  • 选择合适的键值,进行分库分表方式。
  • 写入采用单事务批量写入的方法新增数据
  • 在关键字段建立索引,提高查询效率。
  • 缓存查询数据。

2.在分布式系统中的数据库设计,要注意哪些方面?

任何分布式系统在设计的时候都需要考虑高可靠、可扩展、高可用。

高可靠的意思是每个组件都有很多个备份;可扩展的意思是,可以自由的增加减少节点,自由的增加或者减少算力或者存储能力;高可用的意思是,如果通过各种配套的管理、监控和灾备机制,能够让系统一直稳定运行下去。

数据库通常情况下会有几个组件:数据存储组件、计算组件。分布式环境下的数据存储会拆分成多份,而且每一份都需要在不同机器上有多个备份,数据备份的时候还需要考虑是同城备份还是跨城备份,备份的时候还需要考虑是同步备份还是异步备份。计算组件不涉及到备份,所以需要考虑的是如何能够快速的扩展。

分布式数据库涉及到分布式事务,要能够把分布式事务的复杂性与客户隔离,需要一个分布式事务协调器。

3.常见的数据库调优策略有哪些?

数据库调优的目标:

  • 节省系统资源,以便系统可以提供更大负荷的服务。(吞吐量更大)
  • 合理的结构设计和参数调整,以提高用户操作响应的速度。(响应速度更快)
  • 减少系统的瓶颈,提高数据库整体性能。

如何定位调优问题:

  • 用户的反馈(主要)
  • 日志分析(主要):通过查看数据库日志和操作系统日志风方式找出异常情况。
  • 服务器资源使用监控:监控服务器的CPU、内存、I/O等使用情况,实时了解服务器的性能,,与历史情况进行对比。
  • 数据库内部状况监控:在数据库的监控中,活动会话(Active Session)监控是一个重要的指标。通过它可以清楚地了解数据库当前是否处于非常繁忙地状态,是否存在SQL堆积等。
  • 其它:除了活动会话监控以外,我们也可以对事务、锁等待等进行监控。

常见优化步骤:

  1. 选择适合的 DBMS:在传统关系型和NoSQL数据库中选型。NoSQL阵营包括键值型数据库、文档型数据库、搜索引擎、列式存储和图形数据库。这些数据库的优缺点和使用场景各不相同,比如列式存储数据库可以大幅度降低系统的I/O,适合于分布式文件系统,但如果数据需要频繁地增删改,那么列式存储就不太使用了。
  2. 优化表设计:表结构要尽量遵循三范式的原则。这样可以让数据结构更加清晰规范,减少冗余字段,同时也减少了在更新,插入和删除数据时等异常情况的发生。如果查询应用比较多,尤其是需要进行多表联查的时候,可以采用反范式化进行优化。反范式采用空间换时间的方式,通过增加冗余字段提高查询的效率。
  3. 优化查询逻辑:SQL查询优化,可以分为逻辑查询优化和物理查询优化。逻辑查询优化就是通过改变SQL语句的内容让SQL执行效率更高效,采用的方式是对SQL语句进行等价交换,对查询进行重写。SQL的查询优化重写包括了子查询优化,等价谓词重写、视图重写、条件简化、连接消除和嵌套连接消除等。

库级优化步骤:

  • 读写分离:如果读和写的业务量都很大,并且它们都在同一个数据路服务器中进行操作,那么数据库的性能就会出现瓶颈,这时为了提高系统的性能,优化用户体验,我们可以采用读写分离的方式降低主数据库的负载,比如用主数据库(master)完成写操作,用从数据库(slave)完成读操作。
  • 数据分片:当数据量级达到千万级以上时,有时候我们需要把一个数据库切成多份,放到不同的数据库服务器上,减少对单一数据库服务器的访问压力。如果我们使用的是 MySQL,就可以使用 MySQL 自带的分区表功能,当然也可以考虑从自己做垂直拆分(分库)、水平拆分(分表)、垂直+水平拆分(分库分表)。

参考(摘抄的文字版权属于原作者)
https://www.cnblogs.com/nanoha/p/15965016.htmlopen in new window
https://baijiahao.baidu.com/s?id=1711110021714548857&wfr=spider&for=pcopen in new window
https://www.jianshu.com/p/15bc0d0c15d1open in new window

上次编辑于: