垂直分区MySQL表

时间:2018-03-27 06:50:08

标签: mysql join partitioning

我正在审查一个案例,其中我有200多个列,主要是varchar(100)。这些列来自几个外部数据源,如CRM /人口统计数据等。我无法将它们保存在一个MySQL表中,列数越来越多。

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

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

MySQL版本:5.7 存储引擎:InnoDB

1 个答案:

答案 0 :(得分:1)

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

  • 多列真的是#34;一个数组在列中展开"?例如," foo1",foo2"," foo3",...?如果是这样,真正的 应该只是垂直分区,而是在另一个表中变成多行。

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

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

  • 是否有一些列"稀疏"?也就是说,大多数行没有这些值的条目?然后收集到一个JSON列中。 (或者有几个JSON列,如果存在明显的拆分。)如果你有旧版本的MySQL / MariaDB(你不要),只需将JSON字符串放入{{1}即可。 }专栏。

如果您仍然处于垂直分区状态,则列数和表数会使TEXT性能差异很小。最好看一下JOIN来决定在每个分区中放入哪些列 - 在一个表中进行所有搜索(命中多个表的SELECTs子句通常效率低下)。拥有一个通常未使用的分区可以让你避免使用WHERE