在MYSQL数据库中,将字符串作为主键 [已关闭]

25 浏览
0 Comments

在MYSQL数据库中,将字符串作为主键 [已关闭]

我对数据库及其工作原理不太熟悉。在性能角度上(插入/更新/查询),使用字符串作为主键是否比使用整数慢?\n例如,我有一个数据库,大约有1亿行,包含手机号码、姓名和电子邮件。其中手机号码和电子邮件应该是唯一的。所以我可以将手机号码或电子邮件作为主键吗?当我基于电子邮件或手机号码进行搜索时,会影响查询性能吗?同样,主键将作为外键在5到6个或更多的表中使用。我使用的是MySQL数据库。

0
0 Comments

在MySQL数据库中,使用字符串作为主键可能会导致性能问题。当在一个具有聚集索引的表中插入数据时,如果插入发生在序列的中间位置,不会导致索引的重写,也不会导致组成数据的页面的重写。如果页面上有足够的空间可以放置新的行数据,那么新的行将被放置在该页面上。当页面被填满时,会发生页面拆分,其中一半的行数据被移动到一个新页面上,另一半行数据被移动到另一个新页面上。然后,这些页面会重新连接成一个链表,形成具有聚集索引的表的数据。最多,你可能会写入两个页面的数据库。

这是一个很好的解释。但是,这是否适用于所有的SQL数据库呢?我曾听说在使用随机UUID作为主键时,MySQL存在性能问题。

0
0 Comments

在使用字符串作为主键时面临的另一个问题是,由于索引不断被放入顺序,当创建一个新的键,该键将位于顺序的中间时,索引必须重新排序...如果使用自动递增的整数,新键只需添加到索引的末尾。

然而,这可能会导致新插入的“热点”。只要正确管理数据库,页面上应该有额外的空间用于插入,并且页面拆分应该很少发生。

这就是主键聚集时会出现的情况。你也可以创建非聚集的主键。

XIDs是有序的,如果只使用XID字符串可能会有帮助。

有人能解释一下为什么“索引必须重新排序”吗?据我所知,数据库使用平衡二叉树来索引数据,所以它不在乎新行是否在中间。

我想这取决于你当时使用的数据库技术。这个问题已经有13年了,所以在当时,基于字符串的索引在SQL Server中引起了问题。

0
0 Comments

使用字符串作为主键是可能的,但如果字符串在逻辑上适合作为主键,则应该使用它。这取决于您要创建的表的大小以及将成为主键的字符串的长度(较长的字符串==较难比较)。对于包含数百万行的表,我不会使用字符串作为主键,但是在较小的表上使用字符串所带来的性能减慢将微不足道,相比于使用与数据无关的整数所带来的困扰。

这是否取决于数据库呢?我认为,如果正确建立索引,使用字符串可能不会比数字慢。

我同意这有很多变量要考虑。(在sqlserver中)即使进行了索引,我们在使用长度在中到高十几个字符以上的字符串时也遇到了真正的性能问题。但是你是对的,有一些可以克服这个问题的方法,例如硬件。

说得对。我同意,如果字符串有意义,那就应该使用它。我还会说,在数据库中,有时需要使用GUID或UUID字段,而自动递增字段无法满足需求。

还要记住,在进行索引比较时,CHAR和VARCHAR之间通常存在很大的区别。

这个答案的评论数量表明它是多么不完整。提及索引将是最低可接受的答案。

根据以上内容,可以得出结论:

问题的出现原因:讨论字符串是否适合作为MYSQL数据库中的主键,并就性能问题进行了讨论。

解决方法:根据表的大小和字符串的长度来决定是否使用字符串作为主键。对于较大的表,不建议使用字符串作为主键,因为较长的字符串比较困难。对于较小的表,使用字符串作为主键所带来的性能减慢微不足道。还可以考虑使用索引来提高性能,但是对于长度较长的字符串可能仍然存在性能问题。此外,还提到了使用GUID或UUID字段来替代自动递增字段的情况。同时,需要注意CHAR和VARCHAR在进行索引比较时可能存在的差异。

0