您不创建子表以便每行存储一个浮点值而不是数组,这是有原因的吗?
假设您每天存储一千个包含 300 个元素的数组。即每天 300,000 行,即每年 1.095 亿行。没有什么可打喷嚏的,但在MySQL或任何其他RDBMS的功能范围内。
重新发表您的意见:
当然,如果订单很重要,则为订单添加另一列。以下是我设计表的方式:
CREATE TABLE VectorData (
trial_id INT NOT NULL,
vector_no SMALLINT UNSIGNED NOT NULL,
order_no SMALLINT UNSIGNED NOT NULL,
element FLOAT NOT NULL,
PRIMARY KEY (trial_id, vector_no),
FOREIGN KEY (trial_id) REFERENCES Trials (trial_id)
);
因此,通过存储数组,您可以节省大约 2400 个字节,即 67% 的空间。但假设您有 100GB 的空间来存储数据库。存储序列化数组允许您存储 8750 万个向量,而规范化设计仅允许您存储 2980 万个向量。
您说您每天存储几百个矢量,因此您将在短短81年内(而不是239年)填满100GB的分区。
回复您的评论:INSERT的性能是一个重要问题,但您每天只存储几百个矢量。
大多数MySQL应用程序可以实现每秒数百或数千次插入,而无需过多的巫术。
如果您需要最佳性能,可以考虑以下事项:
- 显式事务
- 多行插入语法
- 插入延迟(如果您仍在使用 MyISAM)
- 加载文件中的数据
- 更改表禁用键,执行插入,更改表启用键
在您喜欢的搜索引擎上搜索短语“mysql每秒插入数”,以阅读许多讨论此内容的文章和博客。