如今,关系数据库是一种流行的数据存储解决方案。
如果您有有限的存储空间和一个简单的数据模型,那么您可能从 RDBMS 开始——至少 在您设计系统时是这样。
话虽如此,随着您的系统不断增长,您可能会开始存储越来越多的数据。最终,这会导致数据库性能下降:查询变得太慢、数据不可用、性能不佳等。
可悲的是,你不能简单地通过增加更多的 CPU 或内存来改进它。
请允许我在下面解释如何解决这些问题:
关系数据库简介
如上所述,您的项目是建立在关系数据库上的。
一开始,它结构良好,可以满足您的业务需求。所有输入数据库的数据都是通过批量处理实时完成的。以及处理基于多个表格的综合报告。
一切都很顺利,直到数据集增长到某个点。
现在,您可能会注意到数据库在添加额外数据时往往会遇到很多问题。除此之外,您可能会注意到某些过程比平时花费的时间更长。
直到此时,一切都那么顺利,过程似乎是看不见的。现在,您正试图超越超时,试图“分块”数据,而您的生活一天比一天复杂!
你能做些什么呢?以下是一些提示:
1.优化查询
最明显的做法是获取统计报告。不同的数据库对此有自己的工具。
寻找有关统计数据的常见元素是:
- 哪些查询正在运行?
- 他们被处决了多少次?
- 他们执行了多长时间?
- CPU使用率。
同样对于每个单独的查询,您可以尝试查找查询将如何执行。这称为 查询解释器。 这向您展示了数据库应该做什么才能为特定查询提供结果。
但请注意,不同数据库(例如测试和生产环境)上的查询解释器可能会显示不同的结果。
而且,在同一个数据库上,同样的查询,设置不同的参数可能会产生不同的结果。
分析结果并决定如何相应地更改您的查询。
2.添加索引
如果优化对您没有帮助,那么您可以考虑添加额外 的索引。
当然,你不能只添加任何索引,那样是行不通的!所以,你应该明智地这样做:
- 首先,请记住,简单地“读取”数据(具有索引)会更快,但实际上通过删除/更新插入来更改数据会更慢。
- 其次,索引需要额外的磁盘空间。根据经验,索引可能需要近 30-50% 的数据量!
您应该在数据库的文档中查看它支持的索引类型以及它们是否与您的问题一致。
添加索引应该与优化查询步骤一起完成。
3. 更新统计
当数据库执行查询时,它会尝试找到最优化的方法。
指标统计 有助于做出正确决策。但是,统计数据可能是旧的,并且数据库可能会开始对错误的查询顺序做出错误的决定。查询解释器可以轻松获取这一点。
根据我的经验,更新统计数据可以与所有其他过程并行完成。这不是一项艰巨的任务,只需记住检查数据库上的文档即可。
4. 重组索引
由于插入、删除和更新各种信息,数据的索引最终可能以非最佳方式存储。
如果我们谈论的是 树索引, 那么树应该是“平衡的”,以便搜索花费更少的时间来搜索特定的键。
请注意(并记住)索引的重组是一项繁重的任务,通常不应在对该表执行其他查询时执行。它应该是一个单独的独立查询,您可以将其安排在系统负载较少的时间。
5. 移除约束
您可以做的另一件事就是从字段中删除约束。
我在说哪些限制?
NOT NULL,NOT EMPTY,或更全面的一个。您可以通过删除它们来节省许多 CPU 资源。
在某些情况下,这是一个瓶颈。这种方法可以帮助您快速获得此过程的回报。
6.删除外键
当您第一次开始学习关系数据库时,您可能会看到一个有趣的功能是在表上添加 外键 。
外键有助于避免插入不正确的数据。但是,这会消耗大量宝贵的计算能力!考虑删除它。
一些有经验的开发者说你永远不应该使用外键;我同意他们!我什至投票赞成不首先创建它们!
7. 非规范化表
另一个步骤是忽略您在关系数据库规范化方面学到的知识。
做相反的事情—— 非规范化你的数据。非规范化通常意味着您可以删除查询中的“连接”。但副作用是:
- 您现在手动处理不同表中数据的一致性并为其使用事务;
- 这会带来插入数据的开销并使查询速度变慢;
- 这需要更多的磁盘空间。
8. 在服务器之间分发数据
您可以在不同的服务器之间拆分数据。
想想可以帮助在逻辑上分离不同服务器上的模型的功能。例如,您可以按地区、日期、各种客户属性等进行拆分。这完全取决于您的业务模型。
另一个需要考虑的因素是“如何去做”。这是一项非常重要的任务,需要对模型和 API 进行大量更改以使用数据。
此类迁移是您系统的主要版本。
9. 按服务拆分数据库
您可以尝试将数据分成两个不同的部分:“在线数据”和“报告数据”。”
然而,这样做的缺点是同步任务变得非常复杂并且需要大量的架构决策。
10. 改进数据库的硬件
为您的数据库购买更好 的硬件 。
如果您从非常便宜的主机开始,那么您可以轻松升级它。
但你不能无限地这样做。更全面的硬件将变得非常昂贵,不仅在购买价格方面,而且在维护方面也是如此。
数据库有专门的硬件,价格可能很高。但在个别情况下不太可能有必要,主要是针对存储 TB 级数据的大型公司。
综上所述
这个故事涵盖了有关如何对数据库进行故障排除以使其更快运行的不同想法。我不能说我提到了所有可能的方法,但我强调了其中最重要的一种。我希望你喜欢它
10-ways-to-optimize-your-database-zz2q3753