如何定义高效查找表?现有关联表设计优化问询
优化方案建议
针对你的需求(仅需按obj_id加载对应属性列表,无需按attr_id或assignment查询),可以采用以下几种更高效的表设计方案:
1. 序列化同obj_id的属性数据存储
把每个obj_id对应的<attr_id, assignment>列表序列化成单个字段存储,每个obj_id仅占一行记录,直接将数据量压缩到原设计的1/x(x为每个obj_id的平均关联记录数)。
示例表结构(以JSON为例):
CREATE TABLE Associations ( obj_id int unsigned NOT NULL PRIMARY KEY, attrs JSON NOT NULL );
attrs字段存储格式示例:
[{"attr_id": 1001, "assignment": 3.14}, {"attr_id": 1002, "assignment": 2.718}]
应用层加载时,只需根据obj_id取出该字段,反序列化成你需要的obj_id -> listof(<attr_id, assignment>)映射即可。
优点:
- 数据行数锐减,存储空间占用大幅降低
- 按
obj_id查询时仅需读取单条记录,IO效率更高 - 表结构简洁,维护成本低
注意:
- 序列化格式可按需选择:JSON可读性强适合调试,MessagePack、Protocol Buffers等二进制格式序列化/反序列化效率更高
- 主流关系型数据库(MySQL、PostgreSQL等)均支持JSON类型存储,二进制格式可存为
BLOB字段
2. 预生成应用直接加载的缓存文件(适合静态/低频更新数据)
如果数据更新不频繁,可以定期将数据导出为应用层直接兼容的格式(比如二进制文件、按obj_id分组的CSV),应用启动时直接加载到内存,完全跳过数据库查询环节。这种方式性能最优,适合数据变动少的场景。
3. 列存储表(备选,适合潜在查询扩展需求)
如果使用支持列存储的数据库(如PostgreSQL列存表、ClickHouse),可以保留原表结构,但利用列存储的高压缩特性减少存储空间。不过因为你当前无需按attr_id或assignment查询,这个方案的收益不如序列化存储明显,适合后续可能需要扩展查询能力的场景。
内容的提问来源于stack exchange,提问作者Jim
相关产品推荐
相关产品推荐

