当数据量增加时,如何提升数据库性能?

简介: 当数据量增加时,如何提升数据库性能?

数据库优化--当写入数据增加时,如何实现分库分表?


高并发下数据库的一种优化方案:读写分离。就是一老主从复制的技术使得数据库实现数据复制多份,增加抵抗大量并发的得写能力。提升数据库的查询性能。以提高数据的安全性,


640.png


数据库订单量突破5000w ,订单单表存储,读写性能都将下降,数据库磁盘也会爆浆,因此需要心情更高效的解决方式,方便西戎继续正常运转。

随着数据量的增加,这时要考虑如下问题:


  • 系统数据不断增加,单表超过千万甚至上亿级别,这时就算使用了索引,索引的占用空间也将随着数据量的增大而增大,这样会影响到查询性能。如何提升查询性能?
  • 数据量的增加也占据的磁盘空间,数据库备份和恢复时间变长,如何让数据库系统支持如此大的数据量?
  • 不同模块的数据,如果全部存在一个库,一旦发生故障,所有模块都将受到影响,如何做到不同模块是故障隔离的?
  • 4核8G 的服务器,大体可以支持500 TPS 和10000QPS ,数据库的写能力弱于数据查询能力,随着数据量的增加,如何提高系统的并发写入请求?


答案是:分库分表


数据的写入请求造成大量性能、可用性等问题,要解决这些问题,要做的就是分片,突破单机数据库的瓶颈。


如何对数据库做垂直拆分


不同于主从复制的数据是全量拷贝到多个节点,分库分表后,每个节点保存部分的数据,这样可以有效的减少单个数据库节点和单个数据表中存储的数据量。在解决了数据存储瓶颈的同时,有效的提升数据查询的性能。

数据库分表的方式有两种:垂直拆分和水平拆分。


垂直拆分


垂直拆分原则一般是按照业务进行拆分,核心思想是专库专用,量业务耦合度比较高的表拆分到单独的库中,把不同的业务数据拆分到不同的数据库节点,这样一旦数据库发生故障只会影响到某一个模块的功能,不会影响到整体功能。从而实现数据层面的故障隔离。

如果单一数据库或者数据表无法满足存储和查询需求,这个时候对数据库和数据表做水平拆分。


数据库如何水平拆分


拆分的规则,一般如下:

  • hash 分表 按照某个字段做 hash 值拆分,这种拆分方式适用于实体表,比如用户表,内容表,这些实体表可以以实体表的 ID 字段来拆分。


640.png

  • 按照时间字段区间来拆分


按照时间字段拆分,比如常用的时间字段,内容表中都有创建时间, 我们可能需要使用时间字段来查看一个人发布的内容,比如你想看昨天发布的朋友圈,或者一个月前的朋友圈,这样就朋友圈内容表,就可以采用“创建时间”这个时间字段来做分库分表。

一般来说,一个人一段时间的订单,一段时间发布的朋友圈内容,这些都可以采用时间字段来分库分表。采用这个拆分规则,一般需要提前建表。


640.png


分库分表之后,数据的访问带来了很大的改变,原先的查询条件从数据库中查就可以,但是使用分库分表之后,需要确定数据在哪个表,然后再到哪个库表中查询数据,这种复杂度会可以使用中间件来处理。比如 TDDL Sharding-JDBC 来实现。


分库分表带来的问题


问题:分片键


分库分表引入的一个问题就是分库分表键,也叫做分区键,分库分表规则无论是 hash 分表还是 时间字段拆分,每次都要选取这个数据库字段,才能找到数据所在的库和表,否则只能向所有库的所有表发送查询命令。如果一个表被分成 16个库和64 个表,那么一次查询会变成 16*64=1024 次查询。


有什么方法解决?


建立映射表,比如用户表是采用ID 作为分片键的,可以通过用户昵称和 ID 做一张映射表,当要查询的时候,先通过昵称找到ID ,然后找到对应的表,这样就能找到对应哪个库,哪个表的数据。


问题:数据库特性的实现困难


如果多表 JoIn 在单表是通过一个SQL 完成的,但是分库分表之后,无法跨库执行 SQL,不过一般来说对 JOIN 操作需求不高,如果有可以把两个表数据取出来,然后在业务层做处理。其次比如 Count() 操作,数据被分散到多个表,这样只能一个表 count, 当然,也可以采用 在分布式缓存 Redis 中记录数据总数。


总结


分库分表,必然会带来不便,但是能够提升数据库的扩展性和提升读写性能,避免单机的容量和请求量的限制。解决数据量过大导致的性能和容量瓶颈。

分库分表主要方式垂直拆分和水平拆分,水平拆分方式有 Hash 分表,或者按照时间字段拆分,分库分表带来的分片键可使用映射表来处理。

  1. 如果没有性能瓶颈,尽量不分库分表
  2. 如果要做,就一次性做到位。
  3. NoSQL 数据库 Hbase 、MongoDB 有自动分片特性,可以考虑代替传统关系型数据库。
相关文章
|
2月前
|
缓存 关系型数据库 BI
使用MYSQL Report分析数据库性能(下)
使用MYSQL Report分析数据库性能
125 3
|
6月前
|
负载均衡 算法 关系型数据库
大数据大厂之MySQL数据库课程设计:揭秘MySQL集群架构负载均衡核心算法:从理论到Java代码实战,让你的数据库性能飙升!
本文聚焦 MySQL 集群架构中的负载均衡算法,阐述其重要性。详细介绍轮询、加权轮询、最少连接、加权最少连接、随机、源地址哈希等常用算法,分析各自优缺点及适用场景。并提供 Java 语言代码实现示例,助力直观理解。文章结构清晰,语言通俗易懂,对理解和应用负载均衡算法具有实用价值和参考价值。
大数据大厂之MySQL数据库课程设计:揭秘MySQL集群架构负载均衡核心算法:从理论到Java代码实战,让你的数据库性能飙升!
|
2月前
|
缓存 监控 关系型数据库
使用MYSQL Report分析数据库性能(上)
最终建议:当前系统是完美的读密集型负载模型,优化重点应放在减少行读取量和提高数据定位效率。通过索引优化、分区策略和内存缓存,预期可降低30%的CPU负载,同时保持100%的缓冲池命中率。建议每百万次查询后刷新统计信息以持续优化
208 6
|
2月前
|
缓存 监控 关系型数据库
使用MYSQL Report分析数据库性能(中)
使用MYSQL Report分析数据库性能
139 1
|
3月前
|
缓存 关系型数据库 MySQL
MySQL数据库性能调优:实用技术与策略
通过秉持以上的策略实施具体的优化措施,可以确保MySQL数据库的高效稳定运行。务必结合具体情况,动态调整优化策略,才能充分发挥数据库的性能潜力。
182 0
|
8月前
|
SQL 关系型数据库 MySQL
如何优化SQL查询以提高数据库性能?
这篇文章以生动的比喻介绍了优化SQL查询的重要性及方法。它首先将未优化的SQL查询比作在自助餐厅贪多嚼不烂的行为,强调了只获取必要数据的必要性。接着,文章详细讲解了四种优化策略:**精简选择**(避免使用`SELECT *`)、**专业筛选**(利用`WHERE`缩小范围)、**高效联接**(索引和限制数据量)以及**使用索引**(加速搜索)。此外,还探讨了如何避免N+1查询问题、使用分页限制结果、理解执行计划以及定期维护数据库健康。通过这些技巧,可以显著提升数据库性能,让查询更高效流畅。
|
8月前
|
物联网 测试技术 API
时序数据库 InfluxDB 3.0 版本性能实测报告:写入吞吐量提升效果验证
TSBS 测试表明,对于少于 100 万台设备的数据集,InfluxDB OSS 3.0 的数据写入速度实际上比 InfluxDB OSS 1.8 更慢。 对于 100 万台及以上设备的数据集,InfluxDB OSS 3.0 的数据写入性能才开始超过 InfluxDB OSS 1.8。 InfluxDB OSS 3.0 的数据写入接口与 InfluxDB 1.8 并不兼容,用户无法顺利迁移。
675 7
|
8月前
|
存储 NoSQL MongoDB
从 MongoDB 到 时序数据库 TDengine,沃太能源实现 18 倍写入性能提升
沃太能源是国内领先储能设备生产厂商,数十万储能终端遍布世界各地。此前使用 MongoDB 存储时序数据,但随着设备测点增加,MongoDB 在存储效率、写入性能、查询性能等方面暴露出短板。经过对比,沃太能源选择了专业时序数据库 TDengine,生产效能显著提升:整体上,数据压缩率超 10 倍、写入性能提升 18 倍,查询在特定场景上也实现了数倍的提升。同时减少了技术架构复杂度,实现了零代码数据接入。本文将对 TDengine 在沃太能源的应用情况进行详解。
400 0
|
9月前
|
Cloud Native 关系型数据库 分布式数据库
世界第一!阿里云PolarDB刷新全球数据库性能及性价比记录
世界第一!阿里云PolarDB刷新全球数据库性能及性价比记录
324 0