什么是数据库分区?
分区是将表和索引分成较小的部分,甚至将其细分为较小的部分。可以将它想象成在一个大仓库(一张大桌子)中存放着数百万本不同主题和年份(例如2000–2019年)的不同杂志。分区意味着您将把它们组织在那个大仓库内的不同房间中。它们仍然属于一个仓库,但是现在您根据数据库分区策略在逻辑级别上对它们进行分组。
使用数据库分区有什么好处?
一个好的分区策略是可行的,原因有很多,例如更好的性能,更好的可管理性,更高的可用性或负载平衡。
(1) 更好的性能
如果以上面的杂志仓库为例,您正在寻找2009年10月发行的“体育画报”,并且在发行年份对仓库进行了分区,则只需查看房间或找到您想要的2009年分区。现在,想象一下,在仓库的一个“ 2009”房间内,您放了几个大盒子,然后按照主题或出版物将杂志放在这些盒子里(“体育画报”,“专业摄影师”,“钓鱼”英雄”,…)。这将创建一个子分区,这将使查找所需的杂志变得更加容易,因为您将不再需要浏览所有《 2009年》杂志,但是您可以直接进入2009年会议室,然后直接转到“ “体育画报”框。这就是性能的划分。现在,如果您将不同的杂志放在柜子里,而杂志的所有背面(标题和月份/年份)都在外面,那将与添加索引相同。这样一来,您就可以快速找到正确的杂志并挑选出来,而不必挑选每本杂志并阅读整本杂志,直到找到所需的杂志为止。而且,如果您需要来自两个或多个不同分区(房间,盒子)的数据(杂志),则可以让两个或多个进程(人员)在寻找它,同时您仍可以确保他们不会两次查看同一部分。
(2) 更好的可管理性和负载平衡
您可以将不同的逻辑分区存储在不同的物理磁盘上,甚至在某些情况下甚至可以存储在服务器上。这样,在一个分区/磁盘/服务器上工作并不一定意味着其他分区必须脱机。维护也是如此,如果仅保留最近10年的数据,并且按年范围对表进行分区,则可以轻松地删除(或备份和删除)最早的分区。回到仓库比较,如果您每年将仓库划分为多个房间,并且在2011年房间中完成工作,那么其他所有房间仍然可以使用。如果要删除2000年的所有杂志,则只需从一个房间中取出所有东西,而不必每年浏览每本杂志。
(3) 更高的可用性
由于故障或其他原因造成的停机时间不一定会对其他分区产生影响。备份和恢复也是如此,您可以对每个分区进行独立于其他分区的操作,从而减少了停机时间。
什么时候应该对我的表进行分区?
分区策略中需要考虑以下几件事:
- 大表始终是一个很好的分区候选对象,超过2Gb的一切都是一个开始。
- 如果您的表中包含历史数据,并且数据将按时间顺序添加。例如,如果您按月或天为基础按批次加载数据,则更是如此。在这种类型的分区中,一个分区只能保留最新的分区可更新,而其他分区(旧)则是只读的。
- 如果您需要在不同类型的存储(在某些情况下甚至是服务器)之间分配表。例如,大多数查询都在最近三年的分区上运行,但是您需要在表中保留10年的数据。最古老的7年很少被查询。这样,您可以将最新的三个分区放置在高性能SSD驱动器上,而将最旧的7个分区放置在较旧和较便宜但速度较慢的HD驱动器上。
为什么不使用索引而是分区?
好吧,索引很好。他们甚至很棒!在您的数据库性能工具箱中,它们绝对是必不可少的工具。但是索引非常擅长检索一小部分数据,尤其是散布在整个表中的数据。如果索引可以为您提供超过20%的数据,则可以认为它们最终表现最佳,而真正的转折点大概是数据的1%-5%。但是,当然,这很大程度上取决于许多不同的因素,例如服务器,设置,数据,天气(不,不是天气!),……最重要的是:不要考虑分区或索引。
在一个好的分区策略中,仍然有很多空间和机会可以很好地使用索引。例如,我上面的杂志仓库示例,在仓库内部每年进行分区,在房间内部按出版物进行分区。通过使标题/月份在橱柜而不是框内(这将创建索引)更加可见,从而留下了更多提高性能的机会。
我可以基于什么数据库分区策略?
您在分区表中输入的每一行都应明确属于一个特定分区。分区键定义行将存储在哪个分区中。这个分区键可以是一个字段,也可以包含多个字段的组合,只要它是模棱两可的,那么就很独特。回到杂志的例子,您可以使用“出版年份”作为分区键,但是您不能将“包含汽车品牌的图片”用作每个品牌的分区键和分区,因为这意味着最新的“ Top Gear Magazine”需要同时位于“ Ferrari”和“ Aston Martin”分区中,并且还有更多。
有哪些不同类型的分区?
- 范围分区
- 列表分区
- 哈希分区
- 子分区
(1) 范围分区
按值范围进行分区。这意味着,如果分区键的值在该分区范围内,则对表进行分区,以使行属于特定分区。例如,杂志:我们每年将仓库分成多个房间。这意味着我们有范围分区,其中每个分区的范围从01–01-YYYY到31–12-YYYY。因此,如果我有一本杂志的发布日期为2015年5月,则它将进入2015年5月1日至2015年1月31日至2015年12月31日的范围分区。
间隔分区是范围分区的一种特殊类型,其中间隔分区中的范围始终基于时间,并且在将新数据添加到表中应属于新间隔范围的新数据时自动创建。
(2) 列表分区
通过列表对数据库进行分区,可以通过在表和每个分区的定义中定义分区键来显式控制和定义哪个值进入哪个分区:
- SQL> Create table magazines (Pub_Title varchar(150), Pub_Date (date)) partition by list(Pub_Title) (partition Pub_Title1 values(“Sports Illustrated”, “Mens Health”), partition Pub_Title2 values(“Vanity”, “Flair”), partition Pub_Title3 values(“Yoga Magazine”, “Zen Magazine”));
或者,以杂志为例,您可能已经可以从SQL中读取信息:我们将仓库按每个出版物标题划分为多个房间,但是对于每个不同的出版物标题,我们没有足够的房间,因此我们“列出”了每个房间几个。在第一会议室中,我们放置“体育画报”和“精神健康”;在第二会议室中,我们放置“虚荣”和“天才”;在第三会议室中,我们放置“瑜伽杂志”和“禅宗杂志”。有道理吧?
(3) 哈希分区
在哈希分区中,数据行根据分区键的哈希值映射到分区。如果要在没有明确业务或数据逻辑分区的表上使用分区,并且需要均匀分布的分区,则此功能很有用。例如,您有一个装满杂志的整个仓库,但出版物标题和出版日期是随机的。没有完整的年份,依此类推。但是,您希望将它们平均分配到仓库的十个不同房间中,以便以后需要取回一本(或多本)杂志时,可以同时派出十个人去寻找它们。十个不同的房间。比散列分区派上用场。例如,您选择出版物标题和出版物日期的组合作为分区键,然后让数据库对该键进行哈希处理,然后选择适当的分区,同时将所有杂志平均分配到所有房间。
(4) 子分区
子分区(也称为复合分区)是在分区内部创建分区。它是已经分区表的每个分区的进一步划分。让我们回到杂志仓库。我们首先每年将整套杂志放在不同的房间里。这是基于范围分区的第一个分区。接下来,在每个这些年级房间中,放入盒子,然后在每个盒子中放入所有具有相同出版物名称的杂志。由于在那个房间里,我们只已经有一个特定年份的出版物,所以在那个盒子里,我们只会有一个特定出版物名称和一个特定出版年份的杂志。因此,这非常容易且快速地找到“ Yoga Magazine”,“ 2017年11月版”。或者,在代码中:
- SQL> Create table magazines (Pub_Title(varchar(150)), Pub_Date(date) Partition by rage (Pub_Year(Pub_Date)) Subpartition by list(Pub_Title) ( partition Pub_Title1 values(“Sports Illustrated”, “Mens Health”), partition Pub_Title2 values(“Vanity”, “Flair”), partition Pub_Title3 values(“Yoga Magazine”, “Zen Magazine”) );
如您所见,分区是除数据库工具箱中许多其他工具之外的有价值的工具,对于提高数据库性能,可用性和可维护性非常有用。选择哪种分区策略当然取决于您的数据,但也取决于您将要实现的特定数据库系统的技术可能性。