开发者社区 问答 正文

咨询一个入门问题

咨询一个入门问题
关于主键哪种好
1.非业务主键,如int自增主键
2.业务主键,如商品档案表的"货号"

货品资料偶尔也可能会批量修改

我看了网上的资料说B树索引,如果是自增整数,那么insert时特别快,不用挪动顺序

但是,零售端输入一个货号来开单,或者盘点,需要快速在基础资料查询信息,那么,货号,应该也要建立索引,那么货号建立索引

那么这里想了解一下
现在新增一个资料
是不是int自增主键就会在最后加索引,而货号索引还是得自己去找适合自己的位置,之前货号索引该挪的还是得挪位置
那么问题来了,自增好像没有什么用了?
我的理解对吗?
我是刚接触这些,有哪位朋友给指导一下

我的理解是,新增一个货号,如果有多个索引,所有索引都要维护一遍
那么,货号总之都是要建立索引,直接用它作为主键,那自增索引好像就没有什么用了,不知道我的理解对不对,或者说这个自增主键还有其他特别好的用处,是货号这个主键无法替代的

本问题来自云栖社区【PostgreSQL技术进阶社群】。https://yq.aliyun.com/articles/690084 点击链接欢迎加入社区大社群。

展开
收起
游客886 2019-04-19 10:16:18 1121 分享
分享
版权
举报
阿里云 AI 助理回答

你的理解部分正确,但也存在一些误区。在数据库设计中,选择主键类型(业务主键或非业务主键)和索引策略时,需要权衡多个因素,包括性能、数据完整性、扩展性和易用性等。下面我来详细解释一下:

  1. 自增主键

    • 优点:简单、唯一,插入新记录时效率高,因为B-Tree索引的特性,新值总是追加到索引末尾,不需要移动其他索引项。
    • 缺点:没有业务意义,对于外键关联或者查询时可能不够直观。
  2. 业务主键(如货号):

    • 优点:具有业务含义,直接反映数据内容,便于理解和使用。
    • 缺点:如果作为主键,当业务数据(如货号)发生变更时,可能会引起一系列连锁更新问题,影响性能。另外,如果货号不是严格递增的,插入新记录时可能需要更多的索引调整,影响插入性能。

关于索引维护的问题,无论是自增主键还是业务主键,每当有新的记录插入或现有记录被修改(特别是涉及到索引列的修改),数据库引擎都会自动维护索引结构,确保索引的有效性。这意味着,不论是基于自增ID还是货号建立的索引,在插入或修改数据时,相关索引确实都需要更新。但是,自增ID由于其自然顺序,这种更新的成本通常较低。

至于你提到的“自增好像没有什么用了”,实际上并非如此。自增主键的一个重要优势在于它对写操作(尤其是大量连续插入)的优化,以及减少页分裂的发生,这对于高并发写入场景尤为重要。此外,自增ID不包含业务逻辑,可以避免因业务规则变化导致的数据迁移问题。

总结来说,选择哪种类型的主键取决于具体的应用场景和需求: - 如果系统有大量的写入操作,且对写入性能要求较高,自增主键可能是更好的选择。 - 如果业务上更倾向于通过具有实际意义的字段进行查询和关联,那么采用业务主键可能更为直观和方便,但需注意处理好数据变更带来的潜在问题,并合理设计索引来优化查询性能。

最后,无论选择哪种主键,合理的索引设计都是至关重要的,以确保查询效率。在某些情况下,结合复合索引(即同时包含自增ID和业务字段的索引)也是一个值得考虑的方案,可以在满足不同查询需求的同时平衡性能。

有帮助
无帮助
AI 助理回答生成答案可能存在不准确,仅供参考
0 条回答
写回答
取消 提交回答