如何提高网站性能?一个显而易见的解决方案是升级托管账户。您的网站将拥有更多硬件资源,因此可以同时处理更多请求并更快地传递数据。
无论如何,人们都是这么认为的。但事实总是不一样。
现代网站是一个复杂的系统,包含许多必须协同工作的组件。如果其中一个出现故障,那么整个项目就会变得非常缓慢,无论托管服务器有多强大。其中最重要的组件之一就是数据库。
今天,我们将深入了解数据库的工作原理、导致数据库速度变慢的原因以及如何优化数据库。
数据库性能优化的重要性
在万维网的早期,网站几乎完全由 HTML和媒体文件组成。用户输入网站的 URL 后,网络服务器会将所需的文件提供给浏览器,以将其呈现为可见的文本和图片。每个访问者都会看到相同的内容,他们所能做的就是点击超链接来浏览不同的页面和图片。
现在情况已经大不相同了。
我们经常会同时运行多个脚本和应用程序,以便将最简单的页面变成一个交互式网站。此类解决方案可以实现博客文章下的评论等简单功能,但也可用于支付、订单、订阅等更复杂的事情。如果没有数据库,这一切都不可能实现。
每次用户与您的网站互动时,您的网络应用程序都会向数据库发送请求(或查询),要求其存储新的数据记录或提供现有数据记录。处理这些查询的速度对于网站的整体性能至关重要。
但是你究竟如何判断你的数据库是否快速呢?
由于变量太多,回答这个问题相当棘手。数据库主要有两种类型,还有几十种不同的数据库管理系统 (DBMS),每种都有各自的数据处理机制。
每个系统都有自己的速度监控和测量工具,可以帮助您跟踪性能。不过,数据库操作中需要审查的方面通常是相同的。
他们来了:
- 响应时间——响应时间衡量数据库处理查询并将结果返回给用户所需的时间。您可能会认为这不是最准确的指标。没有两个查询是相同的,并且您在任何给定时间获得的平均响应时间取决于许多不同的因素。
然而,这是用户最关注的指标,你绝对应该关注它。如果平均响应时间增加,网站的整体性能就会下降,所以是时候采取措施了。
- 查询性能 –查询结构对数据库提供所需数据的时间起着重要作用。通过监控单个查询的性能,数据库管理员可以找出速度慢的查询并采取必要的预防措施对其进行优化。
- 查询吞吐量——吞吐量是指数据库一次可以处理的信息量。一方面,管理员必须知道这个量是多少,以便相应地扩展托管环境。但是,他们还必须知道数据是如何传递的。
它可以在少量大型查询中处理,也可以是许多较小查询的结果。这些信息可帮助管理员制定计划并确定他们将使用哪些优化技术。
- 数据库事件 –数据库事件是围绕在数据库中存储、修改或删除数据的事件。用户和应用程序都可能引发数据库事件。
例如,访问者设置新帐户或应用程序自动清理错误日志。一次发生太多事件可能会减慢数据库速度,尤其是在繁忙时段发生时。系统管理员的工作就是避免这种情况。
- 打开数据库连接 –数据库连接促进了软件应用程序用户与数据库之间的通信。在任意时刻打开的连接越多,使用的带宽就越多。然而,新的连接请求对性能和资源使用的影响更大。
这就是为什么连接池的概念越来越受欢迎。连接池是开放数据库连接的缓存,可在用户和软件应用程序之间共享。有了它,访问者就不需要一直发送新请求,而是使用已经打开的连接之一。这可以减少延迟并提高整体性能。
- 数据库错误 –数据库错误通常会导致网站完全崩溃。页面无法访问,访问者看到的只是白色背景和一条错误消息,普通人可能看不懂。
用户可能会点击离开,并且永远不会再回到您的网站,这对您的业务来说并不理想。这就是为什么尽快识别和解决任何数据库错误至关重要。
然而,在监控和优化数据库之前,您需要知道它使用了什么样的技术。
选择正确的数据库和 DBMS
选择正确的数据库管理系统不仅对网站性能至关重要,而且对整个项目的未来也至关重要。不过,在向您展示如何做到这一点之前,我们需要澄清一些概念。
首先,我们需要讨论两种主要的数据库类型:
- 关系数据库 –关系数据库也称为SQL 数据库,因为它们使用结构化查询语言。以这种格式存储的每一点信息都放在表中。您的DBMS 会在不同的表之间建立关系,以便可以更快、更高效地检索和提供数据。
关系数据库采用更简单的数据存储方法。SQL语法易于理解,结构消除了存储重复条目的可能性。
相反,关系数据库设计为在单台机器上运行,因此无法水平扩展。如果您的项目增长到单台服务器不再足够强大的程度,这可能会成为一个问题。
- 非关系型数据库 –非关系型数据库也称为NoSQL(Not Only SQL)。NoSQL 数据库使用多种存储方法来保存信息。有些将信息保存在文件中,有些使用列和表(它们之间没有关系),有些则依赖于复杂的节点网络。
非关系型数据库可以存储更多样化的数据结构,并且由于它们可以在多台服务器上水平扩展,因此它们也非常适合拥有大量数据的大型网站。但是,对于需要处理标准化数据集的常规网站来说,使用非关系型数据库可能会带来不必要的麻烦。
是否使用关系数据库或非关系数据库主要取决于您要构建的站点类型。大多数内容管理系统和网站构建应用程序(如WordPress、Joomla、Drupal、Magento 等)都使用 SQL 数据库,这有几个原因。
首先,许多此类平台的起源可以追溯到 21 世纪初,当时非关系型数据库的管理比现在更加复杂。第二个也是更重要的原因是,大多数Web 应用程序生成的数据往往是可预测的。数据类型有限,结构很少发生变化。
最终,您使用的数据库类型取决于项目的要求。DBMS也是如此。DBMS位于用户或应用程序与数据库之间。它负责处理客户端和服务器之间的查询。
有很多选择。如果您使用 SQL 数据库,则可以从以下选项中进行选择:
- MySQL
- 玛拉雅数据库
- 微软 SQL 服务器
- PostgreSQL
- SQLite
NoSQL 的选择比较有限,最受欢迎的选项是MongoDB和Redis。某些专有产品(例如 Oracle DBMS)可同时适用于关系数据库和非关系数据库。
再次强调,主要考虑因素是查看您用于构建网站的软件支持哪些 DBMS。有些应用程序设计为仅使用一种特定的数据库技术,而其他应用程序则支持多种选项。
选择哪一个取决于许多因素,包括项目规模、增长潜力、构建项目使用的工具以及预算。逐一考虑所有因素,然后放弃不合适的选项,直到剩下几个候选者。
选择范围缩小后,您需要并排比较不同的 DBMS 及其功能。那时您会注意到各个系统之间的某些差异可能会直接影响您的数据库性能。
例如,如果你将MySQL 和 MariaDB进行直接比较,你会发现后者拥有更多的存储引擎和速度优化选项。如果性能是主要考虑因素,那么天平的倾斜点应该很明显。
最后,选择正确的 DBMS 取决于深入的分析和对优先级的仔细安排。
大多数托管主机帐户都带有一系列技术,其中包括数据库管理系统。由于大多数网站都使用关系数据库,因此典型的设置通常具有SQL DBMS。
总体而言,关系数据库更受欢迎,因此我们今天向您展示的优化技术主要围绕它们展开。
数据库索引和查询优化
数据库查询越快,网站就越快。查询执行速度取决于许多不同的因素,包括服务器的性能、同时连接的数量、缓冲区和内存缓存配置等。
然而,确保快速交付数据的最简单方法之一是更好地组织数据。如果您使用关系数据库,最简单的方法之一就是实施索引策略。让我们看一个假设的例子来演示索引的工作原理。
假设您有一个包含 230,000 行的数据库表 - 大约相当于现代英语词典中的条目数。第一列包含 ID,第二列包含单词或短语,第三列包含其各自的定义。条目不按字母顺序排列。
用户想要找到位于第 200,000 行的单词“database”的定义。DBMS 要做的是将表加载到内存中,从最顶部开始,遍历每一行,直到找到正确的行。换句话说,要执行单个查询,您的数据库需要读取 199,999 行。这绝不是最有效的方法,这也是索引存在的原因。
索引是数据库中的独立数据结构。它包含数据库表中一个或多个列的副本,以及指向相关数据所在位置的指针。
在我们的例子中,我们有一个索引,其中包含包含单词和指针的列的副本,这些指针告诉 DBMS 每个条目在主表上的位置。因为这是一个单独的数据结构,所以我们可以按字母顺序排列单词和短语,而不会造成任何其他损害(例如弄乱 ID)。这种索引的好处是双重的。
首先,DBMS 使用字母顺序快速在索引中定位单词。它不会逐一检查 230,000 个单词和短语,而是会检查索引中的第115,000 个条目(中间点),并确定单词“database”按字母顺序排在其之前还是之后。我们假设在第 115,000 个条目下有单词“microscope”,因此“database”肯定在其上方。
“Microscope”及其下面的所有条目都将从搜索中消除。DBMS 将重复相同的过程几次,直到在索引中找到“数据库”条目。这比读取数据库中的每一行要高效得多。
然后,在索引中找到条目后,数据库就拥有了包含相关数据的数据块的坐标。因此,它可以检索定义,而无需将整个数据库表加载到内存中。这使得它更快、更高效。
有什么缺点吗?好吧,作为一个单独的结构,索引不可避免地会占用一些额外的存储空间。此外,您需要仔细选择和组合要添加到索引中的列。理想情况下,您希望索引经常搜索和使用的数据。
然而,巨大的性能优势远远超过任何缺点。
但是如何创建数据库索引?
一个选项是使用CREATE INDEX SQL语句。该语句有详尽的文档,对于具有一定SQL 经验的人来说应该不会有太大的挑战。那些不太习惯使用命令行的人会更喜欢使用基于 GUI 的工具,例如phpMyAdmin。
步骤如下:
1. 通过控制面板打开 phpMyAdmin。如果您使用 SPanel,您可以在用户界面主页的数据库部分下找到图标。
2. 从左侧菜单中选择您想要修改的数据库。
3. 主屏幕现在将显示所选数据库中的所有表。单击您想要索引的表。
4. 转到“结构”选项卡。您将看到表中的所有列。使用复选框选择要添加到索引的列,然后单击列表下方的“索引”按钮。
如果数据没有损坏,phpMyAdmin应该会显示一条消息,表明操作成功。
注意: 请记住,您正在更改数据库 - 数据库是网站的主要组件之一。在尝试创建索引之前,最好先对网站和数据库进行完整备份,以防出现问题。
内存管理和缓冲
缓冲就是高效利用可用的硬件资源。更具体地说,它显示了数据库管理系统如何使用服务器的 RAM 来加快查询执行速度。
每当 DBMS 需要从数据库读取或向数据库写入信息时,它都会将记录的副本保存到服务器的内存中。然后,它会收到对相同数据位的请求,并从 RAM 中获取副本。
为什么会这样?
这是因为从内存提供数据比从磁盘提供数据要快得多。速度差异取决于许多因素,但即使将尖端的 NVMe SSD 与标准 RAM进行比较,我们谈论的也是从内存读取数据时的性能快几倍。您可能已经猜到了,这一切都对整体加载速度和用户体验产生了深远的影响。
显然,服务器内存不是无限的,因此数据库无法在其中存储无限量的数据。实际上,您的数据库会分配一定量的内存,专门用于缓存数据。这被称为缓冲区,如果您的站点使用 InnoDB 存储引擎,则其默认容量为 128MB。
这听起来不算多,有些人听到可以更改它时会很高兴。但是,请记住,增加缓冲区大小不一定能解决所有问题。
部分原因是,为缓冲区分配更多 RAM 会导致对网站性能至关重要的其他组件失去正常运行所需的资源。缓冲区的大小不一定是主要的性能障碍。
这就是为什么,如果数据库的缓冲区存在问题,您就需要更细致地处理该问题。
以下是您可能需要密切关注的一些指标:
- 缓冲池命中率 –此指标显示所有查询中有多少百分比由缓冲区响应以及哪些查询通过磁盘。默认情况下,DBMS将通过缓冲区处理尽可能多的查询。但是,如果请求针对的是未存储在内存中的页面,它将被中继到磁盘,并且其处理速度会慢得多。
这就是为什么尽可能保持缓冲池命中率至关重要。专家建议将数据库配置为大约 90% 的所有查询都由缓冲区处理。
- 页面预期寿命——存储在缓冲区中的每个记录副本都会在一段时间后被删除。数据库越忙,这个时间段就越短。监控数据记录从缓冲区中删除的频率将为您提供平均页面预期寿命——该指标可以帮助您提高数据库的性能。
传统上认为合理的页面预期寿命在 300 秒左右。然而,这个结论是在服务器性能较低的时候得出的。如今,每 4GB RAM 的平均页面预期寿命为 300 秒被认为是正常的。服务器越忙,从缓冲区中删除页面的频率就越高。这会降低页面预期寿命并增加缓冲区无法处理的请求数量。由于磁盘速度太慢,网站的整体性能不可避免地会受到影响。
- 页面读取次数/秒 –此指标表示每秒从磁盘读取的数据量。您希望将其保持在尽可能低的水平,因为无论现代 SSD 有多快,服务器磁盘处理的查询仍然相对较慢。有许多方法可以最大限度地减少磁盘在数据库查询执行中的作用。您可以通过提供足够大小的缓冲区来缓存经常搜索的数据来实现这一点,但您也可以确保信息被正确索引,以便 DBMS 可以更快地找到它。
管理数据库缓冲区大小
有很多方法可以监控数据库缓冲池的运行状况。例如,MySQL Workbench是一款免费的基于 GUI 的数据库管理工具,它有一个性能仪表板,显示各种统计数据,包括缓冲池使用情况、读/写请求、每秒磁盘读取次数等。
更改缓冲区的大小更为复杂。它需要修改 MySQL 的主配置文件 - my.cnf。其确切位置取决于操作系统。大多数基于 Red Hat 的Linux 发行版将其存储在/etc/文件夹中。您需要添加或修改的变量取决于存储引擎。如果您使用 InnoDB - 它是innodb_buffer_pool_size。对于MyISAM 驱动的数据库,它是key_buffer_size。
利用缓存机制
正如我们在上一节中发现的那样,关系数据库具有内置机制,可将信息存储在内存中以便更快地检索。换句话说,它实际上有一个开箱即用的缓存系统。鉴于此,您可能会认为实施其他缓存解决方案是不必要的。
事实并非如此。
大多数缓存解决方案都关注静态数据,如图像、CSS 样式表和 JavaScript 文件,但一些高级系统也可以将数据库生成的数据存储在服务器的 RAM 中以加快传输速度。
它们在许多关键领域的表现都优于默认缓冲池,其中包括:
- 缓存存储方法 –数据库的缓冲区包含具有多个表行和记录的信息页面。专用解决方案构建的缓存往往组织得更好。
- 数据检索机制——缓存解决方案依赖于复杂的键/值系统来定位所需数据,从而实现更快的交付。
- 可扩展性——专用缓存解决方案是为各种类型和规模的项目而构建的。因此,即使您的网站规模不断扩大,它们也可以支持您的项目并确保出色的性能。
缓存系统有几十种,各有优缺点。然而,说到数据库缓存,有两种解决方案脱颖而出。让我们来看看。
Memcached
Memcached 于二十多年前首次发布,多年来,它已成为许多开发堆栈不可或缺的一部分。它因其先进的多功能性而受到网站所有者的欢迎。它支持最流行的编程语言,并具有易于使用的 API,因此配置您的应用程序以使用它应该没有问题。MySQL数据库的特殊插件使设置变得快速而简单。
Memcached 还支持分布式架构,这意味着缓存数据可以同时存储在多个节点上。这听起来相当昂贵,但由于Docker 和 Kubernetes等容器化和虚拟化解决方案,情况就不再如此了。
同时,使用多个节点不仅可以分散负载、提高性能,还可以最大限度地减少潜在的停机时间。这就是为什么过去即使是像 Twitter 这样的大型社交网络也使用 Memcached 的原因。
但现在他们还实施了另一个缓存系统。
Redis
Redis最初于 2009 年发布,与 Memcached 类似,都是开源的,并且受到大多数网络托管服务提供商的支持。与 Memcached 一样,它将数据存储在服务器的 RAM 中,以便更快地传输数据。
与市场竞争对手不同,Redis 写入内存的数据是持久的——快照文件和日志在启动时恢复信息。这与它的键值数据检索系统相结合,意味着 Redis 可以用作功能齐全的非关系数据库管理系统。
如果您使用 SQL 数据库,Redis 可以作为缓存解决方案实现。它提供对数据类型的支持,这是 Memcached 所缺乏的,而且 Redis 支持的语言和应用程序范围更加令人印象深刻。
总体而言,Redis 的多项功能比 Memcached 更强大、更灵活。不过,这两种解决方案都可以显著加快数据库速度,因此考虑使用它们是一个不错的选择。
磁盘 I/O 优化
几乎所有优化技术最终都是为了减少磁盘需要执行的读写操作的次数(磁盘 I/O)。
由于索引的存在,DBMS 不需要在每次需要数据时扫描整个表,并且借助缓冲,许多查询由服务器的随机存取存储器而不是速度慢得多的磁盘来处理。
但是,如果数据库的大小增长到一定程度,数据量就会变得太大,搜索也会变得过于随机,上面的优化方法就无法发挥作用了。尽管你尽了最大努力,磁盘 I/O 仍会上升。
不幸的是,处理这个问题并不像你想象的那么容易。部分原因是诊断问题需要一些技术知识,部分原因是不同的 DBMS 和存储引擎的操作方式不同,可能会影响 I/O。
目前还没有普遍支持的解决方案可以减少磁盘上的输入和输出操作数量。但是,在大多数情况下,有一些技术应该可以奏效:
优化表和索引
我们将从降低磁盘开销的最基本方法开始。一个活跃的数据库必须处理数千个插入、修改和删除表中存储的信息的请求。这些请求越多,数据就越混乱。
大多数 DBMS 都具有内置机制,可自动重新排列信息以加快扫描速度并更快地提供正确的记录。例如,对于MariaDB 和 MySQL来说,它是通过 OPTIMIZE TABLE 语句运行的。对于PostgreSQL 来说,它是 VACUUM。
建议定期使用这些实用程序作为数据库定期维护的一部分。如果您不习惯使用命令行,phpMyAdmin 等工具可以通过图形界面提供该功能。
改善你的索引
只有正确配置索引,索引才能提升数据库的性能。索引大型数据库时,必须格外小心。如果索引中包含经常更新的列,则 DBMS 需要在磁盘上执行更多写入操作。如果您的数据库包含数千(甚至数十万)行,则
尤其如此。
因此,随着数据库的增长,请务必监控其性能。如果数据库速度变慢,请检查索引,看看是否有任何经常修改的数据被编入索引。如果是,最好禁用一些索引,看看这是否会影响速度。
分区
分区是指将大型数据库表拆分成更小、更易于管理的部分。各个分区可以托管在不同的文件系统上,这意味着负载分布更均匀,并且有更多资源可用来保证快速加载速度。此外,将庞大的表分解成更小的块使 DBMS 能够更快地找到所需信息并提高数据库的整体性能。
设置正确的检查点
检查点会告知 DBMS 从内存中复制任何已修改的数据并将其永久保存在服务器的 HDD 或 SSD上。定期检查点可确保您对数据库所做的修改得到保存,并且不会丢失任何数据。
但是,每个检查点都不可避免地会在磁盘上产生活动。有一些方法可以缓和这种活动。
您可以在站点不太繁忙的时段设置检查点,以避免不必要的 I/O 峰值。此外,检查点具有超时功能,如果写入操作耗时过长,则会中止该操作。这可以在高负载期间减轻服务器主存储设备的一些压力。
数据库架构设计
架构定义了数据库中的关键元素(表、行、列、索引和数据条目)及其之间的关系。如果将数据库比作一台机器,架构就是向服务器展示各个组件如何组装以及它们如何工作的蓝图。
毋庸置疑,如果模式设计不当,数据库管理员和软件应用程序都会很难理解。最重要的是,它会使数据检索更加棘手,并减慢查询执行时间。因此,模式的设计至关重要。
但你怎样才能选择正确的一个呢?
首先,从实体关系图 (ERD)开始。ERD 是一种流程图,向您展示系统中元素之间的相互关系。在我们的上下文中,元素是表、列、行和条目,系统是数据库。从
技术上讲,它不是数据库的一部分。它是数据库管理员用来确定如何组织数据的可视化表示。下面,您可以看到典型 WordPress 数据库的 ERD。
当您开始绘制 ERD时,您会发现数十种适用于不同类型数据库的模型。
例如,层次模型是一种树状结构,各个条目之间具有明确的父子关系。如果数据条目具有一对多关系,则此模型适合您。
网络模型引入了集合的概念。它不拘泥于严格的父子结构,如果您的数据组织基于多对多关系,则非常适合。缺点是网络模型的实现和维护比较棘手。
ERD 和模式的模型选择取决于许多因素,其中包括:
- 数据库中存储的数据量。
- 在任何给定时间查询的数据量。
- 数据修改的频率。
- 您需要处理和存储的数据类型。
- 您自己设定的性能基准。
- 您想要拥有的可扩展性选项。
选择模型并明确架构设计后,就该创建它了。有多种方法可以设置新架构。传统主义者更喜欢在 SQL 文件中编写所需的语句,将其上传到服务器,然后通过命令行运行它。
对于那些寻找更适合新手的选项的人来说,通过MySQL Workbench之类的工具进行操作可能是更好的选择。建立与数据库服务器的连接后,您将在主工具栏中看到按钮。
系统会要求您输入新架构的名称以及默认字符集和排序规则。单击“应用”后,MySQL Workbench 将打开 SQL 编辑器,您可以在其中输入所需的语句。
在设计数据库时,您应该关注几个可以提高速度和简化管理的事项。以下是其中一些:
- 易于理解的命名约定 –这里有几条经验法则需要遵循。命名表和列时,请使用完整单词而不是缩写,并用下划线分隔它们。尽可能缩短表和列名称,如果您不想出现语法错误,请确保不要使用保留字。
- 使用正确的数据类型 –关系数据库可以存储各种信息。但是,如果希望它尽可能高效,则必须为每个表和保存的每条记录设置正确的数据类型。例如,存储用户出生日期的列需要使用DATE 类型。如果该列保留用户创建帐户的确切日期和时间,则必须使用DATETIME 类型。
如果您没有设置正确的数据类型,您的数据库将使用太多的磁盘空间,并且查询执行将相对较慢。
- 坚持规范化最佳实践——规范化是一种数据库设计原则,可消除数据冗余、简化数据库结构并大幅缩短查询执行时间。有不少于七种不同的规范化形式可以帮助您实现这一点。它们很少同时使用,但研究所有这些形式是值得的。
扩展数据库资源
扩展意味着向您的托管基础设施添加更多硬件资源以加快您的网站速度。
额外的内存、处理能力和存储确实可以消除相当多的瓶颈,但升级您的帐户不应该是您的首选。事实上,在您诉诸它之前,您必须确保您拥有一个完全优化的数据库,并且已经实施了所有提高速度的技术。不这样做可能会对您的项目产生不止一种影响,而是两种影响。
首先,这是一个是否需要硬件升级的问题。优化的数据库可以在功能较弱的硬件上表现良好并执行更多查询,而组织不良的数据库则运行在顶级机器上。此外,随着数据库越来越大,任何优化的缺乏都会变得更加明显,即使扩大资源也不足以保证快速的加载速度。
其次,最有效的扩展技术通常会使数据库设置更加复杂,维护起来也更加棘手。除非真的需要,否则你不会想处理额外的复杂性。
因此,扩展并不是一条捷径,可以免除改进数据库设计和操作的需要。然而,它通常是确保查询快速高效执行的最佳方法。
数据库扩展有两种类型:垂直和水平。让我们更详细地探讨一下这些概念。
- 垂直数据库扩展 -垂直扩展基本上意味着升级服务器的硬件。如何实现这一点取决于您使用的托管服务类型。如果您使用的是专用服务器,则必须关闭机器并更换物理组件,或者将整个网站迁移到更强大的服务器。如果您使用云 VPS,则无需这样做。得益于虚拟化,您的虚拟服务器具有无限的可扩展性。您只需单击几下即可添加更多CPU 内核、升级 RAM或扩展存储容量。升级几乎不需要做任何事情,只需快速重启即可,因此不会对您的正常运行时间统计数据造成太大影响。
- 水平数据库扩展 –水平数据库扩展也称为分片,主要用于包含数千行表的大型数据库。它涉及将大型表拆分为两个或多个较小的表并将它们存储在单独的节点上。这些节点可以是单独的机器,也可以是Docker 容器的虚拟实例。
但这样做会对数据库性能产生什么影响?
首先,当DBMS 需要查找特定记录时,它不会浏览包含成千上万行和列的庞大表格,而是会扫描一小部分信息。这减少了服务器的负载,有助于提高加载速度。磁盘 I/O 也会减少,因此数据传输速度会更快。
数据可用性也得到了改善。如果其中一个节点出现故障,用户仍然可以访问存储在分片表中不受影响的部分中的信息。
但是如何将一张桌子分成两张呢?
再次,有两种方法——水平和垂直。
为了说明差异,我们将使用一个有四行五列的简单表格。它包含注册用户的详细信息,如下所示:
ID | 名 | 姓 | 出生日期 | 出生地 |
---|---|---|---|---|
001 | 约翰 | 威廉姆斯 | 1990 年 9 月 25 日 | 纽约 |
002 | 简 | 史密斯 | 1989年4月30日 | 圣地亚哥 |
003 | 威廉 | 琼斯 | 1994 年 6 月 5 日 | 达拉斯 |
004 | 山姆 | 车工 | 1992 年 3 月 4 日 | 波士顿 |
水平分割页面的字面意思是在页面上画一条水平线。我们最终得到两个如下所示的表格:
ID | 名 | 姓 | 出生日期 | 出生地 |
---|---|---|---|---|
001 | 约翰 | 威廉姆斯 | 1990 年 9 月 25 日 | 纽约 |
002 | 简 | 史密斯 | 1989年4月30日 | 圣地亚哥 |
和这个:
ID | 名 | 姓 | 出生日期 | 出生地 |
---|---|---|---|---|
003 | 威廉 | 琼斯 | 1994 年 6 月 5 日 | 达拉斯 |
004 | 山姆 | 车工 | 1992 年 3 月 4 日 | 波士顿 |
这两个表可以位于不同的节点上。您可能已经猜到了垂直拆分背后的逻辑。我们将列拆分为两个表,并将它们放置在不同的服务器上。但是,由于我们需要将一个表中的数据与另一个表中的数据关联起来,因此我们需要使用ID 列作为标识符。
结果是:
ID | 名 | 姓 |
---|---|---|
001 | 约翰 | 威廉姆斯 |
002 | 简 | 史密斯 |
003 | 威廉 | 琼斯 |
004 | 山姆 | 车工 |
和:
ID | 出生日期 | 出生地 |
---|---|---|
001 | 1990 年 9 月 25 日 | 纽约 |
002 | 1989年4月30日 | 圣地亚哥 |
003 | 1994 年 6 月 5 日 | 达拉斯 |
004 | 1992 年 3 月 4 日 | 波士顿 |
这个想法是,DBMS 需要扫描的记录要少得多,而且它可以更快地找到所需的信息。
结论
加快数据库速度的任务听起来很艰巨,而且正如您从我们上面的详尽报告中看到的,这个过程有时可能非常复杂。太多因素会影响性能,而解决所有问题对于单个网站所有者来说可能是一项挑战。
好消息是,如果您使用VPS服务,您可以依靠专家为您考虑这些因素。DBMS是您开箱即用的堆栈的一部分,它通常配置为与最流行的应用程序配合使用并发挥最佳性能。
但这并不意味着你不应该知道它是如何工作的,或者你可以做些什么来提高它的速度。上面的深入报告应该会给你提供你需要的所有信息。
常问问题
问: 如何检查我的 VPS 的性能?
答:如果您的服务器性能不达标,您在浏览网页时可能会注意到这一点。话虽如此,最好还是依靠众多在线网页速度测试工具之一。定期使用这些工具,您可以为网站的速度设定一个基准。当它偏离该基准时,您将能够在用户察觉之前发现差异。
问: 你们如何优化数据库性能?
答:更多地了解数据库的工作原理将有助于您了解需要做些什么来提高数据库的速度。这将帮助您了解如何实施索引和缓存等技术,并向您展示它们如何帮助提高性能。
问: 优化数据库性能的目标是什么?
答:浏览典型网站时,您在屏幕上看到的很多内容都存储在数据库中。这些数据传递得越快,您的页面加载速度就越快。页面加载速度越快,用户体验就越好—— 这对于每个在线项目来说都至关重要。