我正在尝试掌握数据库分区的不同概念,这就是我对它的理解:
水平分区/分片:将表拆分到不同的表中,该表将包含初始表中的行的子集(如果拆分Users表,我会看到很多示例大陆,像北美的子表,欧洲的另一个,等等......)。每个分区位于不同的物理位置(了解“机器”)。 据我所知,水平分区和分片是完全相同的(?)。
垂直分区:根据我的理解(http://technet.microsoft.com/en-us/library/ms178148%28v=sql.105%29.aspx),有两种垂直分区:
规范化(包括通过拆分表并使用外键链接来从数据库中删除冗余)。
行拆分,这是我不明白的,规范化和行拆分之间有什么区别?这两种技术在哪些方面有所不同?
我还在这篇文章(Difference between scaling horizontally and vertically for databases)中读到,水平分区和垂直分区之间的区别在于,第一个通过添加更多机器进行扩展,而在第二个通过添加更多功率进行扩展( CPU,RAM)到你现有的机器,是一个正确的定义?我认为这两种技术之间的 核心 差异在于您分割表格的方式。
我很抱歉问题很多,但我有点困惑,因为我遇到的很多不同的网站都说不同的东西。
任何帮助澄清将不胜感激。使用几张表格进行清晰简单演示的任何链接也会非常有用。
答案 0 :(得分:27)
分区是一个相当普遍的概念,可以在许多情况下应用。当它考虑关系数据的分区时,它通常指的是逐行(水平)或逐列(垂直)分解表。
垂直分区(又称行分割)使用与数据库规范化相同的分割技术,但通常术语(垂直/水平)数据分区是指物理优化,而归一化是< em>概念级别。
因为你要求一个简单的演示 - 假设你有一个这样的表:
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) );
例如,当您在查询中很少需要列数据2时,可以应用此类分区。分区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”行(让我们称之为活动行)。像以前一样,完全扫描会更快(特别是如果只有很少的活动行),活动行(和其他行resp。)是连续存储的(它们不会分散在它们与不同行共享的页面周围状态值,活动行更有可能位于页面缓存中。
答案 1 :(得分:20)
保留所有字段EG:表Employees
具有
EG:1。保留所有字段并在多台machine.ay id = 1-100000或100000-200000记录中分配记录,每台记录在一台计算机上,并分布在多台计算机上。
EG:2。为EG区域保留单独的数据库:亚太地区,北美
键:根据条件挑选行集
它类似于规范化,其中同一个表被划分为多个表,并在需要时与连接一起使用。
EG:
id
,name
,designation
放在一个表格中
可能不经常访问的phone
,email
被放入另一个。
键:根据条件挑选一组列。
是关于添加更多计算机,可以提高包括数据库在内的任何系统的响应能力和可用性。想法是将工作负载分配给多台计算机。
是以CPU,内存形式向现有机器或机器添加更多功能,以提高包括数据库在内的任何系统的响应能力和可用性。在虚拟机设置中,可以虚拟配置,而不是添加真正的物理机。
Sameer Sukumaran
答案 2 :(得分:0)
规范化和分裂之间的区别在于这样做的目的。
规范化的主要目的是删除冗余数据其中,行分割的目的是分离较少的必需数据。
例如: - 假设您有一个包含columns-id,Emp_name,Emp_address,Emp_phNo,Emp_other_data,Company_Name,Company_Address,Company_revenue的表All_Details。
现在,如果要对表进行规范化,则需要创建两个新表Employee_Details和Company_Details,并在表Employee_Details中保留company_id的外键。这样就可以删除多余的公司数据。
现在让我们谈谈行拆分。即使在规范化之后,您也只是访问employee_name和emp_phNo,但是您没有经常访问emp_address和emp_other_data。因此,为了提高性能,您将Employee_Details表拆分为两个表。 table1包含经常需要的数据(employee_name和emp_phNo),table2包含不太常用的数据(Emp_address,Emp_other_data)。两个表都具有相同的unique_key列,以便您可以使用unique_key重新创建表Employee_Details的任何行。这可以极大地提高您的系统性能。
答案 3 :(得分:0)
单个数据库出现问题时会出现问题。因此需要对其进行分区,以减少搜索空间,以便它可以更快地执行所需的操作。可以使用各种分区策略,例如:水平分区,垂直分区,基于散列的分区,基于查找的分区。与这些策略相比,水平,垂直缩放是不同的概念。
水平分区:它根据一些关键信息将给定的表/集合拆分为多个表/集合,这有助于获得正确的表,因为水平分区将在不同的节点上具有多个表/机器。例如:区域用户信息。
垂直分区:它将列分成多个部分,如上述答案之一所述,例如:与社交网络应用程序中的用户信息,赞,评论,朋友等相关的列。 / p>
基于哈希的分区:它使用哈希函数来决定表/节点,并在生成哈希时将关键元素作为输入。如果我们改变表的数量,则需要重新安排数据,这是昂贵的。因此,当您想要添加更多表/节点时会出现问题。
基于查找的分区:它使用查找表,有助于根据给定的输入字段重定向到不同的表/节点。我们可以在这种方法中轻松添加新的表/节点。
水平缩放与垂直缩放: 当我们设计任何应用程序时,我们也需要考虑扩展。我们将来如何处理大量流量?我们需要考虑内存消耗,延迟,CPU使用率,容错能力,弹性。垂直扩展可以增加更多资源,例如:cpu,内存到单台机器,以便它可以处理即将到来的流量。但是这种方法存在局限性,您无法添加超过特定限制的资源。水平扩展允许即将到来的流量分布在多个节点上。它需要在前面有负载均衡器,它基本上处理流量,并将流量导航到任何一个节点。水平扩展允许您添加足够数量的服务器,但您还需要这么多节点。