我在谷歌搜索了一个问题,我从今天早上开始问自己,但找不到任何关于它的信息或文章。
我想知道,在以下情况下,要提高性能(仍有一点%):
上下文:我有两列:ID
,AddedAt
(AddedAt
是创建行时的Unix时间戳。)
从理论上讲,如果您插入新行,ID
将为+1,AddedAt
将为当前时间。
现在,让我们说在当前情况下不可能同时插入两个,将AddedAt
用作PK
并删除ID
列会更好吗? AddedAt
只是PK
和UNIX Timestamp
的唯一列。所以在决赛中,我将有一列而不是两列。
我看到的唯一不好的一面可能是AddedAt
上创建的密钥的大小,因为现在的unix时间戳是10位数。
在这种情况下会更好吗?你有什么看法?
编辑:使用timestamp + ms怎么办?
答案 0 :(得分:4)
时间戳以秒为单位。虽然您可能没有同时插入,但由于世界趋于加速,您可能会在一秒钟内获得多个插入。构建您的系统以便正常运行 - 不要使用时间轴作为主键。
此外,对于语句复制,某些时间戳在dbs之间不一致...基于行的复制缓解了这种情况,但仍然是使用它们时需要关注的另一个原因。
从一个好的会议角度来看,如果除了我们以外的其他任何东西,主键应该对自己以外的其他人有一些明确的意义。通常,人们期望密钥的数字或字符值,而不是blob,时间戳,日期时间等......如果以后它用作另一个表中的外键,使用时间戳作为外来时尤其如此密钥可能会让后来的开发人员感到困惑。当然,如果您知道varchar GUID字段是唯一的,请将其用作密钥。请记住,当你用作外键时,如果你有一个巨大的字符串,你会吃掉相当多的记忆。
答案 1 :(得分:2)
假设您可以保证在同一个1秒间隔内不会发生两个事件,那么您可以使用时间戳字段作为PK。
话虽如此,你为什么担心关键尺寸?时间戳可以是10位数,但其内部存储要求仅为4 bytes。相比之下,int也是4个字节,所以你不会丢失任何东西 - 除非你使用bigints,在这种情况下它是8个字节。
另请注意,时间戳字段受y2038k问题的影响。它们基本上是unix时间戳,可以自动格式化为人类可读日期。如果您的应用程序将存在超过26年,那么您应该坚持使用int / bigint,其环绕范围为“插入行的速度”,而不是固定的日期/时间。
答案 2 :(得分:1)
主键不仅仅是技术性的东西,它是某种东西的业务表示,它使每个对象由一行表示唯一。
时间戳是对象的唯一字段,因为您不能(在您的情况下)同时插入两个对象,但它不是业务对象的主要定义(如果您有一个名为“timestamp”的业务对象)然后是的,它插入的时间应该是主键)
ID代表“我的客户有一个代表他的物理ID”:在过去,我们会在纸上给账单,账单......
永远不要忘记计算机科学本身不是目标,而是实现目标的手段。
答案 3 :(得分:0)
我会将ID
列作为主键,因为在某些情况下,unix时间戳会为您提供一个您不期望的值。一个可以连续插入非常快的返回相同的时间戳,另一个是服务器管理员决定使用服务器时间设置猴子。
进行连接可能会更加明显,因为人们通常希望主键是某种唯一ID,而不是时间戳。
答案 4 :(得分:0)
当然是的,但只有在添加新记录时,性能提升才会很小。 此外,您将被迫在所有相关对象中使用foreign_keys的时间戳。
值得考虑的是,如果你期望每秒有很多插入和大量记录(以节省id列及其索引上的存储),但正如你所说的时间戳将是唯一的,所以它每秒最多1条记录: - )