我正在审查一个案例,其中我有200多个列,主要是varchar(100)。这些列来自几个外部数据源,如CRM /人口统计数据等。我无法将它们保存在一个MySQL表中,列数越来越多。
一般查询情境可能包含来自一个或多个垂直分区的列。
MySQL版本:5.7 存储引擎:InnoDB
答案 0 :(得分:1)
如果列组是地址(街道,城市,州,国家,邮政编码),您可以/应该将多个地址移动到单个"位置"表。 (同上其他逻辑分组。)
多列真的是#34;一个数组在列中展开"?例如," foo1",foo2"," foo3",...?如果是这样,真正的 应该只是垂直分区,而是在另一个表中变成多行。
如果某些列确实是数字或日期,请使用相应的数据类型(清理输入后)。
你说"大多数是VARCHAR(100)
"。制定合理的上限;这将有助于(某些)避免行大小限制。
是否有一些列"稀疏"?也就是说,大多数行没有这些值的条目?然后收集到一个JSON
列中。 (或者有几个JSON
列,如果存在明显的拆分。)如果你有旧版本的MySQL / MariaDB(你不要),只需将JSON字符串放入{{1}即可。 }专栏。
如果您仍然处于垂直分区状态,则列数和表数会使TEXT
性能差异很小。最好看一下JOIN
来决定在每个分区中放入哪些列 - 在一个表中进行所有搜索(命中多个表的SELECTs
子句通常效率低下)。拥有一个通常未使用的分区可以让你避免使用WHERE
。