加快数据库性能的8项技术

如果一切似乎都在控制下,你就不会够快”

加快数据库性能的8项技术

文章插图
> Photo by Christina Morillo (original). Thank you!
几乎所有用于最终用户的Web服务都需要存储数据 。它们几乎所有所有人都将它们存储在数据库中 。很多很多使用PostgreSQL,MySQL / MariaDB或MSSQL等关系数据库 。数据库系统非常令人敬畏,因为您可以忘记它们 。他们只是为了处理你的数据持久性……直到他们变慢 。
【加快数据库性能的8项技术】在本文中,您将学习垂直和水平分区,分片,复制等的区别,以及加快数据库的其他方式 。我们走吧!
我们关心什么?对于数据库系统,我们关心一致的一致性和可用性 。我们还需要一个用于交换破损设备和连续备份的工作解决方案 。
一旦满足最低要求,我们可能有几个性能指标:
  • 读取简单查询的性能
  • 读取复杂查询的性能
  • 插入/更新性能
不同应用程序的工作量以重要方式不同 。许多Web应用程序仅使用CRUD,偶尔一次,非常简单的连接 。他们需要快速读取和相对快速的写入 。他们有大量的小交易 。他们有一个OLTP风格的工作量 。
分析团队相比之下需要更复杂的疑问 。如果这些查询需要更多时间,它也是可以接受的 。它们具有少量复杂的选择查询 。他们有一个OLAP风格的工作量 。
找到单个慢查询的一个工具正在记录慢查询(MySQL,PostgreSQL,MSSQL) 。
算法改进在许多情况下,在生产中运行的代码只是恰好工作的第一件事 。对于非开发人员来说,想想你写的最后几块电子邮件 。很可能,至少有一个在哪里你没有花太多时间来改善你的沟通方式 。这是一个代码的故事 。在好公司中,至少第二个人在代码中快速浏览 。但是,当它看起来合理时,我们的开发人员不会详细介绍每一条线 。这意味着总会有改进的空间 。
对于数据库,有两种常见的方法可以改进:添加合理的索引和查询优化 。
1.索引索引允许数据库通过维护有效的搜索数据结构(例如,B树)更快地查找相关行 。这是按表完成的 。添加索引可以计算地昂贵,必须在生产系统上执行,因此通常不经常完成 。
通过SQL创建索引(MySQL,PostgreSQL)很容易:
CREATE INDEX arbitrary_index_nameON your_table_name(column1, column2);添加索引可以加速数据库中的搜索,但慢下来更新/插入/删除语句,除非“在”部分“部分成本耗时 。
2.查询优化查询优化由每个查询的数据库用户完成 。查询可以用几种不同的方式编写,其中一些可以比其他方式更有效 。您可能希望在数据上尝试不同的查询版本并使用Explate语句 。
一个提及的工具是sqlcheck 。它检查常见的SQL查询反模式,例如在一列中具有多个值而不是使用交叉表或通配符选择 。
查询优化主题的略微不同的子类别是n + 1问题/写入循环以发送多个查询,而不是对数据进行一个查询 。
3.业务变更和分区当您正在营业时,您想取悦您的客户 。如果他们要求一个小型功能,您会尝试包含它 。这可能导致功能蠕变 。UNIX哲学表明这是一个很多问题的问题:
“做一件事并做得好 。” - Doug McIlroy.
同样,可以通过用户组拆分Web服务数据 。也许将它们分成区域是有意义的?我在AWS和安全的代码战士上看到过 。也许你可以将其分成“私人客户”,“小型企业客户”或“大型商业客户”?也许应用程序的一部分实际上可以与自己的数据库有自己的服务?
4.复制
加快数据库性能的8项技术

文章插图
> Image by Martin Thoma
如果读是问题,复制是一个简单的解决方案,如果更新的一点时间延迟并不大 。复制将数据库连续复制到另一台计算机 。它加速了读取并充当故障转移机制 。
该想法是拥有一个主服务器和多个复制服务器,该服务器以前在其他名称下已知 。主服务器处理数据的任何更改,而Replication Server只会复制主服务器 。还有其他拓扑,例如环或星形设置 。
另请参阅:MySQL文档,PostgreSQL文档,MSSQL文档
5.水平分区鉴于一个巨大的表,我们可以在另一台机器上存储一些行和其他机器 。按行拆分数据的想法称为水平分区 。
图像解释了多个单词:
加快数据库性能的8项技术

文章插图
> Conceptual example for horizontal partitioning. Image by Martin Thoma.


推荐阅读