MySQL面试问题:什么时候分割数据库,什么时候分割表?

让我们概述一下在MySQL中拆分数据库和表的课程

photo by Geranimo on Unsplash

感谢您阅读这篇文章。更多面试问题:
https://programmerscareer.com/zh-cn/software-interview-set/

主题:了解数据分布

你好,我们将在本课程中开始了解数据分布。首先,让我们确定我们所说的“数据分布”是指什么。

数据分布是将数据、计算任务和应用程序分布在网络中的多个计算机上的方法。分布数据可以提高应用程序的性能、可靠性和可访问性。 😊

数据分布有多种原因。请允许我为您介绍其中的一些主要优势:

提高性能:通过分布数据,可以提高应用程序访问数据的速度。如果有效地执行,数据分布可以确保资源位于需要它们的地方,从而降低访问延迟并提高速度。

冗余和可靠性:通过数据分布,可以存储多个数据副本在不同位置。这提供了冗余并增加了数据的总体可靠性。如果一个服务器失败,应用程序可以从另一个服务器访问相同的数据。

可伸缩性:通过数据分布,当业务或应用程序增长时,可以更轻松地扩展基础设施。新的服务器可以随时添加到网络中。

负载平衡:通过有效地分布数据,可以确保服务器的负载均衡。这确保了无单点瓶,影响应用程序性能的情况不会发生。

数据分布可以采用多种方法,例如水平分区(也称为分片)、垂直分区和功能分区。每种方法都有其特点并适用于不同类型的应用程序。我们将在后续课程中详细探讨这些。

主题:MySQL数据库分割(分片)

我很高兴看到你想深入了解!现在,让我们深入探讨数据分割,也就是分片

在 MySQL 中,分片是将一个较大的数据库分割成更小的、更易于管理的部分,称为分片。每个分片都是一个独立的数据库。

想象一下,类似于将一个大书分割成多个章节,其中每个章节可以独立存储独特的信息。类似地,当我们分片数据库时,它就像将一个大数据库分割成多个“章节”,其中每个章节存储独特的数据。

然而,为什么要这样做呢? 🤔 分片通常用于以下几个原因:

提高性能:分片可以大大提高读/写速度。当您发出查询时,不必浏览整个数据库,只需浏览特定的分片,显著提高速度。

可伸缩性:分片使数据库水平可伸缩。如果您的应用程序增长并且数据库开始变得太大以适合单个服务器,您可以随时添加更多的分片。

可靠性:如果一个分片出现故障,它不会导致整个应用程序崩溃。其他分片将继续运行无事故。

虽然分片有其多种好处,但它也有一些缺点:

增加复杂性:整个数据库环境变得更复杂。

数据分布:您必须决定如何分布数据,这可能会困难。

跨分片加入数据:如果您想要加入来自不同分片的表,这可能会困难或慢。

在 MySQL 中,分片通常在应用程序层上进行,通过分片库或框架。其中一些流行的分片算法包括范围基础、列表基础、哈希基础和目录基础分片。

主题:MySQL中的表分割(分区)

如果记忆中,以前我们讨论了数据分布和为什么要将数据库分割成多个小部分,这个过程称为分片。

类似地,表分区是一种将大表分割成更可管理的小部分的方法,同时仍然能够访问和操作数据,就好像分区的表是一个单独的实体。换句话说,即使数据存储在分区中,从用户的角度来看,它仍然像是一个表。很酷,对吧?

现在,为什么会有用处? 😊

分区可能是解决方案,如果你有一个非常大的表,导致慢查询和更新,特别是如果该表预计会超过单个服务器的容量。

在本质上来说,分区是关于管理和优化数据以提高性能的。在不必要的复杂性出现的情况下使用分区可能会导致问题。

MySQL提供四种分区类型:

1. RANGE分区: 这是分区的简单类型。它最适合处理在特定范围内的数据,例如日期或量。

2. LIST分区: 它根据预定义的值列表进行分区。

3. HASH分区: 在这种情况下,MySQL应用哈希函数在分区键上进行确定。它用于确保数据均匀地分布在指定数量的分区中。

4. KEY分区: 它类似于哈希分区,但在这种情况下,MySQL服务器内部计算哈希值,用户不能控制。

所以,这是理论,在下一课中,我们将讨论如何在 MySQL 中实现这些原理,并提供一些实际示例来帮助说明这个概念。

主题:数据库和表分割的实践例

好的!现在让我们将数据库分片和表分区的理论应用到实际例子中。

例 1:数据库分片

假设我们有一个全球范围的电子商务网站,客户数据在迅速增长中。我们可以为每个地理区创建一个分片,例如北美、欧洲和亚洲等。每个区的数据库分片仅存储位于该区内的客户数据。这样,我们就可以通过局部化数据和查询来提高性能。

例 2:表分区

在我们的电子商务网站的情况下,考虑一种情况,其中我们有 millions 的订单,并且大多数查询都是对最近的订单进行的。我们可以决定按日期分区“Orders”表,并为每个月保存单独的分区。这样,对特定时期的查询只需要扫描更少的行并执行更快。

但是,这些是如何在实践中进行的?

对于 MySQL 中的数据库分片,有各种分片框架可用,例如 Vitess、phpMyAdmin 等。例如,在 Vitess 中,您将定义一个 VSchema,其中包含分片指令来自动分片所需的表。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
{  
"sharded": true,
"vindexes": {
"hash": {
"type": "hash"
}
},
"tables": {
"your_table": {
"column_vindexes": [
{
"column": "your_shard_column",
"name": "hash"
}
]
}
}
}

对于 MySQL 中的表分区,可以使用 ALTER TABLE 命令进行分区。

1
2
3
4
5
6
7
8
9
ALTER TABLE orders  
PARTITION BY RANGE( YEAR(order_date) )
(
PARTITION p0 VALUES LESS THAN (1990),
PARTITION p1 VALUES LESS THAN (2000),
PARTITION p2 VALUES LESS THAN (2010),
PARTITION p3 VALUES LESS THAN (2020),
PARTITION p4 VALUES LESS THAN MAXVALUE
);

在这个脚本中,我们根据“order_date”列对“orders”表进行分区。

请记,这些过程通常由应用程序或框架处理,因此对 SQL 有一些了解是必要的。同时,分片和分区都会带来复杂性,只有在其好处超过复杂性时才应该使用它们。

主题:作出明智的决定

我们已经讨论了很多内容,最后我们将讨论如何作出一个有理由的决定,重复了前面的课程中的一些关键点,并提供了一些额外的提示。

下面是要考虑的因素:

数据库分片(分割)决策作出:

  1. 数据大小:如果数据库变得太大而难以有效处理,可能需要分割。
  2. 性能:如果数据库中的频繁查询因数据量而变慢,分割可以帮助提高处理速度,因为它可以减少每个查询处理的数据量。
  3. 可伸缩性:如果您预计数据库将超过单个服务器的容量,在早期阶段实施分割可能是一个好的预防措施。
  4. 数据类型:分割可能会受数据类型的影响。例如,多租户应用程序,其中来自多个客户的数据存储在同一数据库中是一个分割的好候选。

表分区决策作出:

  1. 表大小:如果表在数据库中变得无限大,可能需要分区。
  2. 查询性能:如果大多数查询只处理表的某个部分(例如,最近的条目),分区可以大大加快这些查询的速度。
  3. 维护:分区也可以帮助维护表(例如,备份、更新和删除),因为这些操作可以在单个分区上执行,而不是对整个表进行线下维护。

在决定是否要分割或分区时,应该根据需要提高性能和处理大量数据或两者都是的。然而,这是一个复杂性增加的决定,应该只有在必要时并且其他简单优化技术不足时才应用。

主题:回顾和评估

我们已经完成了数据分布的旅程,特别是MySQL中的数据库分割(分片)和表分区(分区)。现在,让我们快速回顾一下主要点,然后转到评估来巩固您的学习。

主要点

  1. 了解数据分布:数据分布具有显著的性能优势,但也会增加复杂性。了解何时和怎样使用它是至关重要的。
  2. MySQL数据库分割(分片):MySQL数据库分割涉及将数据库分割为更小的部分,基于一个键。它可以显著提高查询响应时间,增加可靠性并支持水平缩放。
  3. MySQL表分区(分区):MySQL表分区涉及将表分割为更小的部分,而无需更改SQL查询。分区可以根据各种策略进行,例如范围、列值、哈希值等。
  4. 实际示例:我们讨论了如何为全球客户的电子商务网站实现数据库分割,并如何使用表分区来提高性能,以处理最近的数据。
  5. 作出明智的决定:决定是否要实现数据库分割或表分区,或者两者都要,并为什么要考虑数据大小、查询性能、可伸缩性和数据类型。

现在,让我们来进行评估。您将被提供一些场景,并要求决定是否要使用分割、分区、两者都要,或者不要,并为什么。

评估场景

  1. 场景 1:您正在为医院设计应用程序,其中包含一个名为 patients 的表,用于存储患者记录。医院每年处理数千名患者,并且大多数患者只会来一次每年。大多数查询涉及访问最近的患者记录。您应该使用分割、分区、两者都要,或者不要,并为什么?
  2. 场景 2:您正在为技术新闻网站开发应用程序,其中文章经常更新以进行修正,并且新信息和用户评论被不断地写入。评论被存储在一个名为 comments 的表中,每条评论与一个文章相关。您应该使用分割、分区、两者都要,或者不要,并为什么?
  3. 场景 3:您正在为全球范围内的电子商务网站开发应用程序,其中包含一个名为 transactions 的表,包含网站上的所有交易的详细信息。您应该使用分割、分区、两者都要,或者不要,并为什么?

场景 1:根据场景,应该在 patients 表上实现 表分区。查询涉及访问最近的患者记录,并且分区可以为这些查询提供有效的查询性能。分割可能不是必要的,因为我们没有明确的分割键,并且管理分布式事务和维护一致性可能会增加不必要的复杂性。

场景 2:在这种情况下,可能的解决方案是在 comments 表上实现分区。基于日期的分区系统可能会很好地工作,因为旧文章的评论可能会被频繁地读取,但不太可能会更新。分割可能会对这种情况造过多的复杂性。

场景 3:在这种情况下,分割 transactions 表可能会有好处,特别是在交易的位置上。这可能会使来自同一地区的交易被分组在一起,从而可能会导致更有效的查询。此外,分割还可能会帮助平衡多个数据库的负载,并为其提供额外的规模和性能优势。此外,您可能还会考虑分区单个分片。

这些是根据提供的信息而作出的推荐解决方案。然而,每个应用程序可能有独特的要求和约束,并且在作出设计决定时要考虑所有因素。记住,先测量再优化!

English post: https://programmerscareer.com/mysql-interview16/
作者:Wesley Wei – Twitter Wesley Wei – Medium
注意:本文为作者原创,转载请注明出处。

MySQL面试问题:MySQL MVCC的实现原理 常见(20+)软件面试问题(+答案)关于MySQL/Redis/Kafka

评论

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×