几乎任何面向最终用户的网络服务都需要存储数据。几乎所有这些都将它们存储在数据库中。许多很多人使用关系数据库,如PostgreSQL、MySQL/MariaDB或MSSQL。数据库系统很棒,因为您可以忘记它们。他们只是在那里处理您的数据持久性......直到他们放慢速度。在本文中,您将了解垂直和水平分区、分片、复制等之间的区别,以及其他加速数据库的方法。我们走吧!我们关心什么?对于数据库系统,我们关心一致的一致性和可用性。我们还需要一个有效的解决方案来交换损坏的设备和持续备份。一旦满足最低要求,我们可能会有几个性能指标:简单查询的读取性能复杂查询的读取性能插入/更新性能工作负载对于不同的应用程序在重要方面有所不同。许多web应用程序只是偶尔使用CRUD,非常简单的连接。它们需要快速读取和相对快速的写入。他们有很多小交易。他们有一个OLTP风格的工作负载。相比之下,分析团队需要更复杂的问题。如果这些查询花费更多时间,也是可以接受的。他们有少量复杂的选择查询。他们有一个OLAP风格的工作负载。一种查找单个慢速查询的工具是记录慢速查询(MySQL、PostgreSQL、MSSQL)。算法改进在许多情况下,生产中运行的代码只是碰巧起作用的第一件事。对于非开发人员,想想你写的最后几封电子邮件。很有可能,至少有一种情况是您没有花太多时间来改进您的沟通方式。这是一个代码故事。在好的公司里,至少会有第二个人快速浏览一下代码。但是我们的开发人员不会在看似合理的情况下详细说明每一行。这意味着总有改进的余地。对于数据库,有两种常见的改进方法:添加合理的索引和查询优化。1.索引索引允许数据库通过维护有效的搜索数据结构(例如,B树)更快地找到相关行。这是通过表来完成的。添加索引的计算量可能很大,并且必须在生产系统上执行,因此通常很少进行。通过SQL(MySQL、PostgreSQL)创建索引很容易:CREATEINDEXarbitrary_index_nameONyour_table_name(column1,column2);添加索引可以加快数据库中的搜索速度,但会减慢UPDATE/INSERT/DELETE语句的速度,除非“inthe”section”部分成本高且耗时。2查询优化查询优化由数据库用户针对每个查询完成。查询可以用几种不同的方式编写,其中一些可能比其他方式更有效。您可能希望对数据尝试不同版本的查询并使用Explate语句。A提到的工具是sqlcheck。它检查常见的SQL查询反模式,例如在一列中有多个值,而不是使用交叉表或通配符选择。查询优化主题的一个稍微不同的子类别是n+1问题/写入循环,用于发送多个查询而不是一个数据查询。3.业务变更和分区当你在做生意时,你想取悦你的客户。如果他们要求一个小功能,你就尝试包含它。这可能导致功能蠕变。UNIX哲学说这是许多人的问题曲理念:做一件事,并把它做好。”-道格麦克罗伊。同样,Web服务数据可以按用户组拆分。也许将它们分成区域有意义?为了安全起见,我在AWS和CodeWarriors上看到过它。也许您可以将其分为“私人客户”、“小型企业客户”或“大型商业客户”?也许应用程序的一部分实际上可以拥有自己的服务和自己的数据库?4.Copy>ImagebyMartinThomaifread是的问题,如果更新的一点时间延迟不是什么大问题,复制是一个简单的解决方案。复制不断地将数据库复制到另一台计算机。它可以加快读取速度并充当故障转移机制。这个想法是拥有一个主服务器和多个副本服务器,以前以其他名称为人所知。主服务器处理对数据的任何更改,而ReplicationServer只是复制主服务器。还有其他拓扑结构,例如环形或星形设置。另请参阅:MySQL文档、PostgreSQL文档、MSSQL文档5.水平分区给定一个巨大的表,我们可以将一些行存储在另一台机器和其他机器上。按行拆分数据的思想称为水平分区。图像解释多个词:>水平分区的概念示例。图片由马丁托马提供。仅在MySQL/MariaDB中按ID进行简单分区:ALTERTABLEshopping_cartsPARTITIONBYRANGE(id)(Partitionp0VALUESLESTHAN(1234),Partitionp1VALUESLESTHAN(4567),Partitionp2VALUESLESSTHANMAXVALLE希望数据库系统的用户仍然能够使用典型的查询来查询数据库,也许使用以下内容:SELECT*FROMshopping_cartsWHEREcart_id=3这里有一个很重要的事情:水平分区和水平缩放完全没有关系!6.垂直分区大型数据库我们可以按行分区,而是可以按列分区。这可能会给你一种不安的感觉,因为你在大学里学过,规范化数据库是个好主意。这里要注意的重要一点是,我们在谈论数据库设计的不同阶段。各种数据库范式与逻辑设计有关。在这个阶段,我们处理了物理设计。应用程序的不同部分可能不需要一行中的大部分列。为此原因,他们可以分开。因此,垂直分区也称为行分离。一种常见的做法是将元数据从内容中分离出来。这是一张图片:>MartinThoma的图片这里有一件重要的事情:垂直分区与垂直缩放绝对无关!当您避免隐私或监管问题时,垂直分区会很有用。想想信用卡信息。这也可以匹配其他信息,但大多数应用程序不需要它。您甚至可以将它放在一个完全不同的数据库中,并将其隐藏在私有微服务后面。分片——下一级分布您已经看到可以用两种不同的方式对数据进行分组。它可能对同一台机器进行了有意义的分区,以帮助数据库更快地执行常见查询。但是,如果数据库的CPU或RAM已达到极限,则使用不同的机器可能是有意义的。Sharding正在划分单个逻辑数据集并将其分布在不同的机器上。正如您可能猜到的那样,这有很多问题-所以应该只是您最后的选择。例如,由于2010年10月的分发问题,FourSquare减少了11个小时(来源)。到目前为止,我很幸运不必处理分片。第一个明显的问题是您的应用程序需要知道哪些分片包含您要查找的数据。因此您的应用程序逻辑受到影响,可能无处不在。第二个大问题是跨分片加入。第三个问题是如何定义分片。要实现真正的可扩展性,您需要动态定义分片。具有层次结构可以帮助解决这个问题。8.数据库集群我只是在看Vitess时才遇到这个术语。这个想法似乎隐藏了碎片问题,也在幕后使用复制:WintgreSQL也有文档,MySQLCluster是另一个产品。奖励:查询缓存如果您对很少更改的数据有一些繁重的查询,您可以尝试缓存查询。我不确定数据库默认提供什么,但您可以简单地为该查询放置一个键值存储。您可以将查询直接发送到数据库,而不是将查询发送到在键值存储中查找它的微服务。如果不存在或无效,则查询真实数据库。缺点是你不知道你得到的数据是否是最近的。让我们结束吧!下一步是什么?有些主题对发展至关重要,但不是日常工作或计算机科学课程的一部分。您可以在我们的专业软件开发系列中了解更多主题。原文链接:https://betterprogramming.pub/8-techniques-to-speed-up-your-database-292754ff7739
