我正在审查一个案例,其中200+列主要是varchar(100)。这些列来自多个外部数据源,如CRM /人口统计学数据等。我不能将它们保存在一个MySQL表中,因为列的数量在不断增加。
一般查询情况可能包含一个或多个垂直分区的列。
MySQL版本: 5.7
存储引擎: InnoDB
发布于 2018-03-27 07:31:52
我不认为有人能给出一些神奇的数字,比如可接受的列数,或者与工作负载过于紧密相关的信息,比如拆分表是个好主意。变量太多:现有列和索引的数量/类型、查询数量、每次查询读取多少列,等等。适当的测试会给你一个很好的答案。我们所能说的就是,是的,常识说,如果可能的话,这样的桌子应该分开。
但是,每个查询都需要从多个分区读取吗?每个新行都会在所有分区中有匹配吗?这可能会减慢您的应用程序。理想情况下,大多数查询只能从一个分区读取。因此,第一个建议是与开发人员检查是否可以重写一些查询,这样他们就可以读取更少的列--可能需要重写一些SELECT *。
你也会询问最佳的匹配条件。这里的答案很简单:按主键连接。所有匹配的行都应该具有相同的id。它应该是一个表上的AUTO_INCREMENT列。首先将新行插入到表中,然后以这种方式插入其他行:
INSERT INTO t1 (...) VALUES (...);
INSERT INTO t2 (id, ...) VALUES (LAST_INSERT_ID(), ...);
INSERT INTO t3 (id, ...) VALUES (LAST_INSERT_ID(), ...);也不要添加外键,因为它们会减慢你的书写速度。
https://dba.stackexchange.com/questions/202360
复制相似问题