快速掌握:
- 分片将您的数据分布到多个服务器,以实现可扩展性和更好的性能。
- 分区将单个数据库内的表划分为更小的部分(分区),从而提高查询性能和可管理性。
- 索引创建数据结构以加速某些列的数据检索,从而提高查询性能,但代价是额外的存储和写入开销。
数据库分片
分片是一种在多个服务器或数据库之间水平划分数据的方法,这样每个服务器(或“分片”)都包含整个数据集的一个子集。此技术用于提高数据库的可扩展性和性能,尤其是在处理无法在单个服务器中容纳的超大数据集或单个服务器无法处理负载时。
工作原理:
- 数据集根据特定的键或标准(例如用户 ID、地理区域等)被分成分片。
- 每个分片包含数据的一个子集,可以存储在不同的物理机器或服务器上。
- 当执行查询时,它可以根据分片键路由到正确的分片,也可以定向到所有分片(在查询跨越多个分片的情况下)。
要点:
- 水平扩展:分片有助于将数据和负载分布在多台服务器上,从而允许系统水平扩展(即添加更多服务器)而不是垂直扩展(增加单个服务器的容量)。
- 分片键:用于拆分数据的键。它通常是经常查询的字段,例如
user_id
、order_id
等。 - 好处:
- 通过减少每台服务器处理的数据量来提高性能。
- 提高容错能力和可用性(因为数据是分布式的)。
- 实现扩展以处理更多数据和流量。
例子:
- 想象一下,一个社交媒体应用,每个用户的数据都存储在一个数据库中。要对数据进行分片,您可以将 ID 介于 1 到 1,000,000 之间的用户存储在分片 1 中,将 ID 介于 1,000,001 到 2,000,000 之间的用户存储在分片 2 中,依此类推。“分片键”将是
user_id
。
2.数据库分区
分区是指将大型数据库表划分为更小、更易于管理的部分(称为分区),同时将所有分区保留在单个数据库中。分区通常是为了提高查询性能、可管理性和维护性。
工作原理:
- 一个大表被分成几个分区,每个分区包含一部分行。
- 与分片不同,所有分区通常都存储在同一台服务器或数据库中,但它们在逻辑上是分开的,以实现更高效的管理和查询。
分区类型:
范围分区:根据键的范围将数据划分为多个分区(例如,按日期范围对销售数据进行分区)。
- 示例:2020 年的销售数据可能位于一个分区,而 2021 年的销售数据可能位于另一个分区。
列表分区:根据键的特定值(例如一组国家或地区)将数据划分为多个分区。
- 示例:可以按国家代码(美国、英国、印度)对表进行分区。
哈希分区:数据根据应用于列的哈希函数分布在各个分区中。
- 示例:可以通过散列来对表进行分区
user_id
,然后根据散列在各个分区之间分配用户。
复合分区:两种或多种分区类型的组合。例如,您可以先按范围分区,然后按哈希分区。
要点:
- 垂直分区:将数据分成单独的表或数据库(不在同一个表内)。
- 水平分区:将表的行分成更小的子集(类似于分片,但在单个数据库内)。
- 好处:
- 提高查询性能(通过减少被扫描的数据集的大小)。
- 帮助数据管理和维护(例如分区级备份或索引)。
- 可以改进并行处理(因为不同分区上的查询可以并行运行)。
例子:
- 假设您有一张包含数百万行的表。您可以按订单日期
Orders
对表进行分区,以便每个分区包含特定年份或月份的数据。按日期范围过滤的查询将更快,因为只需要访问相关分区。
3.数据库索引
了解 postgres 或 sql 中聚集索引和非聚集索引如何存储在 B+ 树中非常重要,这个概念是经常被问到的。
索引是一种用于提高数据库表上数据检索操作速度的技术,但会在数据插入、删除和更新期间增加额外的空间和开销。索引本质上是一种数据结构(通常是B 树或哈希表),可帮助数据库快速找到与查询条件匹配的行,而无需扫描整个表。
工作原理:
- 索引根据一个或多个列(称为索引列)的值创建有序映射或查找表。
- 当执行查询时,数据库可以使用索引来快速定位符合查询条件的行,而不需要扫描表中的每一行。
索引类型:
单列索引:单列索引。通常用于按该列进行过滤的查询。
email_address
示例:表中的索引Users
可以加快电子邮件搜索速度。
多列(复合)索引:包含多列的索引。这对于基于多列进行过滤的查询很有用。
- 示例:如果查询经常根据两个名称进行过滤,则对
first_name
和列都建立索引。last_name
唯一索引PRIMARY KEY
:强制索引列唯一性的索引。定义或约束时会自动创建此类索引UNIQUE
。
全文索引:一种用于加速文本数据搜索的索引类型,尤其是在使用LIKE
或之类的操作时MATCH
。
text
示例:或列上的全文索引description
可以加快文本搜索速度。
空间索引:用于地理空间数据(例如纬度和经度)的索引,以加快空间查询。
要点:
- 查询性能:索引加快了数据检索操作,特别是对于带有、或或子句的
SELECT
查询。WHERE
JOIN
ORDER BY
- 写入性能影响:虽然索引可以加快读取速度,但它们会给
INSERT
、UPDATE
和DELETE
操作带来一些开销,因为在修改表时也必须更新索引。 - 空间使用情况:索引消耗额外的存储空间,因为它们是存储对表中行的引用的单独数据结构。
例子:
- 对于
Users
表,如果您经常按 进行搜索email_address
,则在该列上创建索引将使这些查询更快。如果没有索引,数据库将不得不扫描表中的每一行,这对于大型表来说可能非常慢。
聚集索引
- 一个表中只能有一个聚集索引
- 对记录进行排序并按顺序进行物理存储
- 数据检索比非聚集索引更快
- 不需要额外的空间来存储逻辑结构
非聚集索引
- 一个表中可以有任意数量的非聚集索引
- 不影响物理顺序。为数据行创建逻辑顺序,并使用指向物理数据文件的指针
- 数据插入/更新比聚集索引更快
- 使用额外的空间来存储逻辑结构