mysql 将唯一列指定为表中的主键时需要考虑的几点[已关闭]

lb3vh1jj  于 2023-05-05  发布在  Mysql
关注(0)|答案(2)|浏览(131)

已关闭,此问题为opinion-based。目前不接受答复。
**想改善这个问题吗?**更新问题,以便editing this post可以用事实和引用来回答。

昨天关门了。
Improve this question
在设计sql表时,我们(几乎)总是添加一个通用的id列作为主键。如果一个表已经包含一个唯一的列,我想知道我们是否应该将其指定为主键,而不使用id列,或者仍然使用它,同时只为唯一的列添加一个unique键索引。上面提到的任何一种方法的含义是什么?
我们最近遇到了一个例子,一个表有一个UUID被指定为主键,但是当使用mysqldump转储数据库时,所述列导致了某些问题。上述表也有一个VARCHAR类型的非空唯一列,因此为了解决上述问题,删除了id列,并将唯一键列指定为主键。
这让我想知道我们是否应该一直这样做,还是只在特定情况下这样做,以及这是否会以任何方式影响该表上的操作。我想到的一些问题是:
1.会不会影响演出?如果是,如果所述表具有较少数量的记录,例如,少于一百,该怎么办?
1.作为串型列的所述唯一列可以包含任何内容。那么,通过主键-外键关系将它与另一个表连接时会导致任何问题吗?
在这方面的任何帮助都是高度赞赏的。

2ekbmq32

2ekbmq321#

以下是使用现有的唯一列作为主键而不是仅为此目的添加特殊列的注意事项列表:

  • 唯一列必须不可为空。
  • 独特的柱应该是便宜的。(例如整数,而不是字符串,特别是不是复合键。这是性能问题。)
  • 唯一列的值在行的整个生存期内应永远不会更改。(即使你的RDBMS允许你改变主键的值,在实践中,强烈建议你避免这样做。
  • 在数据库模式的未来修订中,不太可能将唯一列重构为其他内容(尤其是不重构为非唯一列)。
  • 理想情况下,唯一列应该是一个按顺序递增的数字,以便可以使用聚集索引。(这是性能问题。)
ne5o7dgx

ne5o7dgx2#

我写的3个表中有2个是“自然的”PRIMARY KEY。我避免人为地将id添加到这样的表中。
以下是一些常见的模式。(id是AUTO_INCREMENT`)

  • uuid是非常随机的,因此这可能是最佳的:
PRIMARY KEY (id),
  UNIQUE(uuid)
  • 对于foo和bar之间的many-to-mapping表,这可以节省空间和速度,同时确保不会意外插入重复项。它被实现(在InnoDB中)为两个2列BTrees:
PRIMARY KEY(foo_id, bar_id),  -- for mapping one way
  INDEX(bar_id, foo_id)         -- for mapping the other way
  • 有时人工id是有益的,但这可以让你使用PK“引用的局部性”:
PRIMARY KEY(user_id, id),  -- cluster together all the users stuff
  INDEX(id)    -- sufficient to heep AUTO_INCREMENT happy

至于你的具体问题:

  • PK中列的数据类型是次要的。最大的问题是需要触摸多少行。
  • 在对多列进行测试时,复合(多列)索引通常优于两个单独的列,而不管基数如何。
  • TEXTBLOB不能被索引,前缀(例如,INDEX(ext(50)))并不能真正解决您的问题。
  • 外键只检查值是否存在;索引的类型(主要/唯一/索引)无关紧要。
  • UUIDs在很多方面都是邪恶的;在可行的情况下避免它们。【我的看法。】
  • 一张table增加了更多的蠕虫。
  • INSERTing一行必须等待检查所有PRIMARY和UNIQUE键的重复,然后才能完成。其他二级密钥以“延迟”技术(使用“更改缓冲区”)插入。也就是说,最小化表中唯一键的数量有一点好处。

相关问题