You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 11:05:05