3500万行发票明细表:复合主键vs拼接字段主键选型疑问
复合主键 vs 拼接式代理主键:发票明细表的选择
直接用invoice_num+line_num作为复合主键的优势
- 性能更优:针对3500万行的大表,复合主键的索引占用空间更小。比如
invoice_num为字符串、line_num为整数时,拼接成单个字符串的存储长度远大于两个字段组合,会导致索引树臃肿,增加查询、插入的IO开销。 - 规避拼接冲突风险:若
invoice_num包含特殊字符(比如分隔符),拼接后可能出现唯一性冲突——例如inv-123+4与inv-12+34拼接结果均为inv-1234,反而破坏主键唯一性。 - 贴合业务语义:这两个字段本身就是业务层面的唯一标识,用复合主键能直接体现数据的业务约束,后续维护时逻辑更清晰。
拼接成代理主键的劣势(针对你的场景)
- 额外存储与计算成本:数据加载时需额外执行拼接操作,表中还要多存一个冗余字段,3500万行的规模会浪费大量存储空间。
- 索引效率低下:单个拼接字段的索引键长度更长,数据库维护索引的成本更高,插入、更新速度会变慢。
- 无业务复用价值:你明确该字段组合不会被查询,拼接后的字段仅作为主键存在,属于无意义的冗余信息。
补充建议
如果后续需要用单个主键关联其他表,更推荐使用自增整数代理键——它的索引效率远高于拼接字符串,占用空间极小,关联操作也更快。但如果仅需满足当前表的主键约束,复合主键完全够用。
总结:你的场景下,直接用invoice_num和line_num创建复合主键是更合理的选择,既满足唯一性约束,又能保证性能与维护性。
内容的提问来源于stack exchange,提问作者Ryzone
相关产品推荐
相关产品推荐

