垂直分区 MySQL 表

Posted

技术标签:

【中文标题】垂直分区 MySQL 表【英文标题】:Vertical Partition MySQL table 【发布时间】:2018-03-27 06:50:08 【问题描述】:

我正在审查一个案例,其中我有 200 多个列,主要是 varchar(100)。这些列来自多个外部数据源,如 CRM / Demographics 数据等。我无法将它们保存在一个列数不断增长的 mysql 表中。

一般查询情况可能包含来自一个或多个垂直分区的列。

垂直拆分它们是个好主意吗?并加入他们的查询? 每个分区的大小(列数)应该是多少?提高性能。 最佳的 JOIN 匹配条件应该是什么?

MySQL 版本:5.7 存储引擎:InnoDB

【问题讨论】:

水平分区呢? 问题在于行大小限制。我认为水平分区将有助于大量行,而不是大量列。 好的,但是表格通常垂直而不是水平增长。 这些列必须有一些押韵或理由。来自一个数据源的一些列,来自另一个数据源的一些列,等等。为了真正回答您的问题,有必要更多地了解现有列及其来源。您只需要分析它们是什么以及它们的性质。 【参考方案1】:

如果列组是地址(街道、城市、州、国家、邮政编码),您可以/应该将多个地址移动到单个“位置”表中。 (其他逻辑分组也是如此。)

多列真的是“跨列展开的数组”吗? eg, "foo1", foo2", "foo3", ...?这样的话,真正的应该不只是垂直分区,而是在另一个表中变成多行。

如果某些列确实是数字或日期,请使用适当的数据类型(在清理输入之后)。

你说“大多数是VARCHAR(100)”。制定合理的上限;这将有助于(某些)避免行大小限制。

某些列是否“稀疏”?也就是说,大多数行没有这些值的条目?然后收集到单个 JSON 列中。 (或几个 JSON 列,如果有明显的拆分。)如果您有旧版本的 MySQL/MariaDB(您没有),只需将 JSON 字符串放入 TEXT 列。

如果您仍然坚持垂直分区,那么列数和表数对JOIN 性能的影响很小。最好查看SELECTs 来决定在每个分区中放置哪些列——将所有搜索都放在一个表中(WHERE 子句命中多个表通常效率低下)。拥有一个通常不用的分区可能会让您避免使用JOINing

【讨论】:

以上是关于垂直分区 MySQL 表的主要内容,如果未能解决你的问题,请参考以下文章

mysql分区及分表

mysql表分区

Mysql 表分区和性能

mysql表分区实验总结

MySQL 表分区

数据库分区 - 水平与垂直 - 规范化和行拆分之间的区别?