我正在构建一个包含特定列的相当大的表,my_column
. 有少量可能的值my_column
,并且每个唯一值都my_column
应该有相同数量的与之关联的行。此外,查询很可能一次只关注一个特定的值my_column
。我看到一种选择是根据my_column
. 我看到的另一种选择是完全创建一个单独的表,以便每个表都与my_column
. 我想知道是什么导致我选择一个选项而不是另一个选项。
据我了解,一个分区的大表似乎是“正确”或“纯粹”的方式,因为这似乎是分区的主要用例。但是,我怀疑出于实际原因,第二种选择更好,这就是我所倾向于的。我不知道这是否重要,但我正在处理 MyISAM 表。
我对你的第二个选项有一个建议。
如果您需要将具有每个唯一
my_column
值的 MyISAM 表与其他 MyISAM 表分开,您可能需要查看MERGE (Mrg_MyISAM) 存储引擎作为表分区的替代方案。这将允许将同一数据库中具有相同表结构和索引布局的多个 MyISAM 表映射在一起,从而使单个查询命中所有 MyISAM 表。
假设您有一个如下表:
你有 3 个这样的表(tb1、tb2、tb3),其中
您可以将它们合并到单个表映射下,如下所示:
要对所有表执行搜索,只需使用 tbmerge。例如,假设您想查看 tb2 中以“Jack”开头的每个名称,您可以运行以下查询:
鉴于表的设计,您应该始终指定 my_column 的值。事实上,对于 tb1 的每个索引,确保 my_column 始终是第一列。原因?针对 tbmerge 的查询始终是针对 tb1、tb2、tb3(所有基础表)的查询。否则,此查询
将遇到可怕的性能,因为它将对所有基础表执行表扫描。请按照这个简单的规则仔细计划您将使用的索引(使用 my_column 作为每个索引的第一列)
还有一个额外的好处:您可以在方便时插入基础表,从而使用
我在之前的一篇文章(2012 年 1 月 4 日)中使用 MERGE 表讨论了这个问题。
如果系统中的大多数查询:
比方说,以下查询适合修改为分区:
如果您的查询有其他条件使得结果只是该值中总行数的微不足道的一部分,那么分区并不比单个表好得多。如下示例(假设参与列上有复合索引):
预期行的百分比
用于评估策略的百分比取决于“my_column”中有多少不同的值以及原始单个表的行大小。
您拥有的不同值越少,应考虑的预期行百分比就越少。您拥有的行大小越大,应考虑的预期行的百分比就越少。
最好设计一些实验来反映您的估计。