我试图掌握数据库分区的不同概念,这就是我对它的理解:
水平分区/分片:将表拆分为不同的表,该表将包含初始表中行的子集(如果按大陆拆分用户表,我已经看到了很多示例,例如北美的子表,欧洲的另一个子表等(。每个分区位于不同的物理位置(了解"机器"(。据我了解,水平分区和分片是完全相同的东西(?
垂直分区:根据我的理解(http://technet.microsoft.com/en-us/library/ms178148%28v=sql.105%29.aspx(,有两种垂直分区:
-
规范化(包括通过拆分表并使用外键链接它们来从数据库中删除冗余(。
行拆分, 这是我不明白的,规范化和行拆分有什么区别?这两种技术在哪些方面彼此不同?
我还在这篇文章中读到(数据库水平和垂直扩展之间的区别(水平分区和垂直分区之间的区别在于,在第一种情况下,您通过添加更多机器进行扩展,而在第二篇中,您可以通过向现有机器添加更多功率(CPU、RAM(进行扩展,这是一个正确的定义吗?我认为这两种技术之间的核心区别在于您拆分表的方式。
我很抱歉有这么多问题,但我有点困惑,因为我遇到的很多不同网站都说不同的话。
任何帮助澄清将不胜感激。任何指向带有几张表格的清晰简单演示的链接也将非常有帮助。
分区是一个相当笼统的概念,可以应用于许多上下文。当它考虑关系数据的分区时,它通常是指按行(水平(或按列(垂直(分解表。
垂直分区(又称行拆分(使用与数据库规范化相同的拆分技术,但通常术语(垂直/水平(数据分区是指物理优化,而规范化是概念级别的优化。
由于您要求一个简单的演示 - 假设您有这样的表格:
create table data (
id integer primary key,
status char(1) not null,
data1 varchar2(10) not null,
data2 varchar2(10) not null);
垂直分区data
的一种方法:按如下方式拆分:
create table data_main (
id integer primary key,
status char(1) not null,
data1 varchar2(10) not null );
create table data_rarely_used (
id integer primary key,
data2 varchar2(10) not null,
foreign key (id) references data_main (id) );
例如,当您在查询中很少需要列 data2 时,可以应用这种分区。分区data_main将占用更少的空间,因此全表扫描将更快,并且更有可能适合DBMS的页面缓存。缺点:当你必须查询data
的所有列时,你不得不乖乖地连接表,这将比查询原始表更昂贵。
请注意,拆分列的方式与规范化表时相同。但是,在这种情况下,data
已经可以规范化为 3NF(甚至 BCNF 和 4NF(,但出于物理优化的原因,您决定进一步拆分它。
一种使用 Oracle 语法对data
进行水平分区的方法:
create table data (
id integer primary key,
status char(1),
data1 varchar2(10),
data2 varchar2(10) )
partition by list (status) (
partition active_data values ( 'A' ),
partition other_data values(default)
);
这将告诉 DBMS 在内部将表data
存储在两个段(如两个表(中,具体取决于列status
的值。这种分区data
方式可以应用,例如,当您通常只查询一个分区的行时,例如,状态"A"行(我们称它们为活动行(。像以前一样,完全扫描会更快(特别是如果只有几个活动行(,活动行(和其他行(是连续存储的(它们不会分散在它们与不同状态值的行共享的页面周围,并且活动行更有可能在页面缓存中。
数据库中的水平分区
保留 EG:Table Employees
的所有字段
- id,
- 名字
- 地理位置
- 电子邮件
- 指定
- 电话
EG:1.在多台机器中保留所有字段和分布记录。例如 id= 一台机器中的 1-100000 或 100000-200000 条记录,并分布在多台机器上。
EG:2.为区域保留单独的数据库 EG:亚太地区,北美
键:根据条件选取行集
数据库中的垂直分区
它类似于规范化,其中同一个表被划分为多个表,并在需要时与联接一起使用。
例如: id
, name
, designation
放在一个表中,然后
phone
,可能不经常访问的email
被放在另一个。
键:根据条件选取列集。
- 水平/垂直缩放不同于分区
水平缩放:
是关于添加更多计算机以提高任何系统(包括数据库(的响应能力和可用性。这个想法是将工作负载分配给多台机器。
垂直缩放:
是关于以CPU,内存的形式向现有机器或机器添加更多功能,以提高包括数据库在内的任何系统的响应能力和可用性。在虚拟机设置中,可以虚拟配置它,而不是添加真实的物理机。
萨米尔·苏库马兰
当单一数据库开始变得庞大时,它就会出现问题。因此需要对其进行分区,以减少搜索空间,以便它可以更快地执行所需的操作。有多种可用的分区策略,例如:水平分区,垂直分区,基于哈希的分区,基于查找的分区。与这些策略相比,水平、垂直缩放是不同的概念。
- 水平分区
:它根据一些关键信息将给定的表/集合拆分为多个表/集合,这有助于获得正确的表,因为水平分区在不同的节点/机器上有多个表。 例如:区域明智的用户信息。
垂直分区 :它将列分成多个部分,如上述答案之一所述,例如:社交网络应用程序中与用户信息,喜欢,评论,朋友等相关的列。
基于哈希的分区:它使用哈希函数来决定表/节点,并将关键元素作为生成哈希的输入。如果我们更改表的数量,则需要重新排列数据,这是昂贵的。所以当你想添加更多的表/节点时,有一个问题。
基于查找的分区:它使用查找表,有助于根据给定的输入字段重定向到不同的表/节点。我们可以在这种方法中轻松添加新的表/节点。
水平缩放与垂直缩放:当我们设计任何应用程序时,我们也需要考虑扩展。我们将如何处理未来的大量流量?我们需要考虑内存消耗、延迟、CPU 使用率、容错能力、弹性。垂直扩展增加了更多资源,例如:CPU,单台机器的内存,以便它可以处理即将到来的流量。但是这种方法存在局限性,您不能添加超过特定限制的资源。水平扩展允许传入的流量分布在多个节点上。它需要在前面有负载均衡器,基本上处理流量,并将流量导航到任何一个节点。水平扩展允许您添加足够数量的服务器,但您还需要这些节点。
规范化和拆分之间的区别在于这样做的目的。
规范化的主要目的是删除冗余数据,其中行拆分的目的是分离不太需要的数据。
例如:- 假设您有一个包含列的表All_Details - id , Emp_name, Emp_address, Emp_phNo ,Emp_other_data, Company_Name , Company_Address , Company_revenue。
现在,如果要规范化表,则需要创建两个新的表Employee_Details和Company_Details,并在表Employee_Details中保留外键company_id。
现在让我们谈谈行拆分。假设即使在规范化之后,您也只能访问employee_name和emp_phNo,但您不会如此频繁地访问emp_address和emp_other_data。因此,为了提高性能,您将Employee_Details表拆分为两个表。表1包含经常需要的数据(employee_name和emp_phNo(,表2包含不太需要的数据(Emp_address,Emp_other_data(。两个表将具有相同的unique_key列,以便您可以使用unique_key重新创建任何表Employee_Details行。 这可以大大提高您的系统性能。