我很难理解表分区的优缺点。我即将开始一个项目,该项目将有 8 个表,其中一个将是主数据表,将保存 180-2.6 亿条记录。因为它将是正确索引的表,所以我正在考虑将表记录限制为 2000 万,这样我就必须创建 9-13 个表。
但是我不太确定它将如何提高性能,因为它们将位于同一台机器上(32GB RAM)?
我正在使用 MySQL,表将是 MyISAM,大表将在 id 字段上有索引,并且没有像全文搜索等进一步的复杂性。
还请阐明表分区与数据库分区。
我很难理解表分区的优缺点。我即将开始一个项目,该项目将有 8 个表,其中一个将是主数据表,将保存 180-2.6 亿条记录。因为它将是正确索引的表,所以我正在考虑将表记录限制为 2000 万,这样我就必须创建 9-13 个表。
但是我不太确定它将如何提高性能,因为它们将位于同一台机器上(32GB RAM)?
我正在使用 MySQL,表将是 MyISAM,大表将在 id 字段上有索引,并且没有像全文搜索等进一步的复杂性。
还请阐明表分区与数据库分区。
以下只是疯狂的咆哮和咆哮......
如果将所有数据保留在一个表中(无分区),则使用键的搜索时间为 O(log n)。让我们以世界上最糟糕的索引二叉树为例。每个树节点只有一个键。具有 268,435,455 (2^28 - 1) 个树节点的完美平衡二叉树的高度为 28。如果将此二叉树拆分为 16 棵独立的树,您将得到 16 棵二叉树,每棵树有 16,777,215 (2^24 - 1)高度为 24 的树节点。搜索路径减少了 4 个节点,高度减少了 14.2857 %。如果搜索时间以微秒为单位,则搜索时间减少 14.2857 % 几乎可以忽略不计。
现在在现实世界中,BTREE 索引将具有带有多个键的树节点。每个 BTREE 搜索都会在页面内执行二进制搜索,并可能下降到另一个页面。例如,如果每个 BTREE 页面包含 1024 个键,则树高 3 或 4 将是常态,实际上是短树高。
请注意,表的分区不会降低已经很小的 BTREE 的高度。给定 2.6 亿行的分区,甚至很有可能拥有多个具有相同高度的 BTREE。每次搜索一个键可能会经过所有根 BTREE 页面。只有一个会满足所需搜索范围的路径。
现在对此进行扩展。所有分区都存在于同一台机器上。如果每个分区没有单独的磁盘,那么磁盘 I/O 和主轴旋转将成为分区搜索性能之外的自动瓶颈。
在这种情况下,如果 id 是唯一被使用的搜索键,那么按数据库分区也不会给您带来任何好处。
数据分区应该用于对在同一类中逻辑和内聚的数据进行分组。只要数据被正确分组,搜索每个分区的性能不必是主要考虑因素。一旦你实现了逻辑分区,然后专注于搜索时间。如果您仅按 id 分隔数据,则可能永远不会访问许多数据行以进行读取或写入。现在,这应该是一个主要考虑因素:找到所有最常访问的 id 并按. 所有不经常访问的 id 都应该驻留在一个大存档表中,该存档表仍然可以通过索引查找来访问“蓝月亮”查询。
总体影响应该是至少有两个分区:一个分区用于频繁访问的 id,另一个分区用于其余 id。如果经常访问的 id 的数量相当大,您可以选择对其进行分区。
2 亿行肯定在您可以从表分区中受益的范围内。根据您的应用程序,您可以打赌下面列出的一些好处:
易于清除旧数据如果您需要清除(例如)6 个月以上的记录,您可以按日期对表进行分区,然后换出旧分区。这比从表中删除数据要快得多,并且通常可以在实时系统上完成。在 OP 的情况下,这可能有助于系统维护。
多个磁盘卷分区允许您拆分数据以在多个磁盘卷之间分配磁盘流量以提高速度。使用现代 RAID 控制器,这对 OP 来说不太可能成为问题。
更快的表和范围扫描实际上,操作系统不应该做这种事情,但是数据仓库或类似的系统会大量做这种查询。表扫描主要使用顺序磁盘流量,因此它们通常是处理返回表中超过百分之几行的查询的最有效方式。
如果可以根据分区键解析谓词,则通过公共过滤器(通常基于时间或周期)进行分区允许从此类查询中消除表的大块。它还允许将表拆分为多个卷,这可以为大型数据集带来显着的性能提升。通常,这对于操作系统来说不是问题。
出于 OP 的目的,分区不太可能为操作查询带来太多性能优势,但它可能对系统管理很有用。如果对报告大量数据的聚合有任何重要要求,那么适当的分区方案可能会有所帮助。
如果所有索引都已分区,则分区允许按分区进行并发重组。如果不是,分区仍然小得多,并且使用更少的工作空间进行重组。而且,在内部,任何“好的”DBMS 都可以与分区表并行执行。这可能不包括 MySQL 或 MyISAM,虽然....