Mysql 时间戳和 AUTO_INCREMENT 作为主键
Mysql timestamp and AUTO_INCREMENT as primary key
我正在考虑为我的数据编制索引的最佳方式。使用时间戳作为我的主键是个好主意吗?无论如何我都在保存它,我想保存一些列。由于性能原因,时间戳应该是整数而不是日期时间列。此外,我不想在短时间内(两秒之间)限制数据量。因此,我想到了一个额外的 AUTO_INCREMENT 专栏。现在我有一个唯一的密钥(时间戳和 AI),我可以使用命令“LAST_INSERT_ID”轻松获取当前插入的 ID。是否可以每秒/有新时间戳时重置 AI 计数器?或者是否可以检测是否有相同时间戳的数据集并增加AI值(我仍然希望能够使用LAST_INSERT_ID)。
请分享一些想法。
The timestamp should be an integer not a datetime column, because of performance.
我认为您相信 datetime
是作为字符串存储的。 It is stored as numbers quite efficiently and with a wider range and more accuracy 比一个整数。
使用整数可能会降低性能,因为数据库可能无法正确索引它以用作时间戳。这将使查询复杂化,因为如果不先将整数转换为日期时间,您将无法使用完整的 date and time functions 套件。
使用合适的date/time类型,索引,让数据库优化。
Moreover I don't want to be restricted on the amount of data in a short time (between two seconds). Therefore, I thought about an [additional] AUTO_INCREEMENT column.
这似乎违背了“保存一些列”的意义。现在你的主键是两个整数。更糟糕的是,它是一个 compound 键,它要求所有引用都存储这两个值,这增加了存储要求并使连接复杂化。
确定下一个主键所需的所有额外工作 可以 在 insert trigger 中完成,但现在您为每个插入增加了复杂性和额外工作.
Is it a good idea to use the timestamp as my primary key?
主键应该是 A) 唯一的和 B) 不可变的。时间戳不是唯一的,您可能需要更改它。
您的主键不太可能成为性能或存储瓶颈。除非你有充分的理由,否则请坚持使用一个简单的、自动递增的大整数。一个大整数,因为20亿比你想象的要少。
MySQL 将其封装在 serial
中,即 bigint unsigned not null auto_increment unique
.
TIMESTAMP
和 DATETIME
作为 PRIMARY KEY
是有风险的,因为 PK 必须是唯一的。
不然拿来做PK或者索引也没问题。但这里有一些注意事项:
- 使用复合索引(多列)时,先把
=
测试的东西放在前面;将日期时间放在最后。
- PK越小越好。
TIMESTAMP
和 DATETIME
占用 5 个字节(不包括微秒时); INT
为4个字节; BIGINT
是 8。
- 将一个 PK 值与另一个进行比较所花费的时间是微不足道的。这包括角色 PK。例如,
country_code CHAR(2) CHARACTER SET ascii
只有 2 个字节——比 'normalizing' 更好,用 4 个字节的 cc_id INT
. 代替它
- 所以,不,不要费心使用 INT 而不是 TIMESTAMP。
- 根据我的经验,table 中有 2/3 的人具有“自然”PK,不需要 auto_increment PK。
- 使用 auto_inc 最糟糕的地方之一是在多对多映射 table 上。它可能会使大多数操作减慢 2 倍。
您在 PRIMARY KEY(timestamp, ai)
处暗示:
- 您需要添加
INDEX(ai)
才能让 AUTO_INCREMENT
开心。
- 它为临时 'near' 行提供参考位置。但
ai
本身也是如此。
- 不,没有每秒重置 ai 的实用方法。 (MyISAM 有这样的,但不要使用那个引擎。)相反,一定要声明
ai
足够大以在溢出之前持续 'forever'。
- 但我想不出没有更好方法的用例。
我正在考虑为我的数据编制索引的最佳方式。使用时间戳作为我的主键是个好主意吗?无论如何我都在保存它,我想保存一些列。由于性能原因,时间戳应该是整数而不是日期时间列。此外,我不想在短时间内(两秒之间)限制数据量。因此,我想到了一个额外的 AUTO_INCREMENT 专栏。现在我有一个唯一的密钥(时间戳和 AI),我可以使用命令“LAST_INSERT_ID”轻松获取当前插入的 ID。是否可以每秒/有新时间戳时重置 AI 计数器?或者是否可以检测是否有相同时间戳的数据集并增加AI值(我仍然希望能够使用LAST_INSERT_ID)。
请分享一些想法。
The timestamp should be an integer not a datetime column, because of performance.
我认为您相信 datetime
是作为字符串存储的。 It is stored as numbers quite efficiently and with a wider range and more accuracy 比一个整数。
使用整数可能会降低性能,因为数据库可能无法正确索引它以用作时间戳。这将使查询复杂化,因为如果不先将整数转换为日期时间,您将无法使用完整的 date and time functions 套件。
使用合适的date/time类型,索引,让数据库优化。
Moreover I don't want to be restricted on the amount of data in a short time (between two seconds). Therefore, I thought about an [additional] AUTO_INCREEMENT column.
这似乎违背了“保存一些列”的意义。现在你的主键是两个整数。更糟糕的是,它是一个 compound 键,它要求所有引用都存储这两个值,这增加了存储要求并使连接复杂化。
确定下一个主键所需的所有额外工作 可以 在 insert trigger 中完成,但现在您为每个插入增加了复杂性和额外工作.
Is it a good idea to use the timestamp as my primary key?
主键应该是 A) 唯一的和 B) 不可变的。时间戳不是唯一的,您可能需要更改它。
您的主键不太可能成为性能或存储瓶颈。除非你有充分的理由,否则请坚持使用一个简单的、自动递增的大整数。一个大整数,因为20亿比你想象的要少。
MySQL 将其封装在 serial
中,即 bigint unsigned not null auto_increment unique
.
TIMESTAMP
和 DATETIME
作为 PRIMARY KEY
是有风险的,因为 PK 必须是唯一的。
不然拿来做PK或者索引也没问题。但这里有一些注意事项:
- 使用复合索引(多列)时,先把
=
测试的东西放在前面;将日期时间放在最后。 - PK越小越好。
TIMESTAMP
和DATETIME
占用 5 个字节(不包括微秒时);INT
为4个字节;BIGINT
是 8。 - 将一个 PK 值与另一个进行比较所花费的时间是微不足道的。这包括角色 PK。例如,
country_code CHAR(2) CHARACTER SET ascii
只有 2 个字节——比 'normalizing' 更好,用 4 个字节的cc_id INT
. 代替它
- 所以,不,不要费心使用 INT 而不是 TIMESTAMP。
- 根据我的经验,table 中有 2/3 的人具有“自然”PK,不需要 auto_increment PK。
- 使用 auto_inc 最糟糕的地方之一是在多对多映射 table 上。它可能会使大多数操作减慢 2 倍。
您在 PRIMARY KEY(timestamp, ai)
处暗示:
- 您需要添加
INDEX(ai)
才能让AUTO_INCREMENT
开心。 - 它为临时 'near' 行提供参考位置。但
ai
本身也是如此。 - 不,没有每秒重置 ai 的实用方法。 (MyISAM 有这样的,但不要使用那个引擎。)相反,一定要声明
ai
足够大以在溢出之前持续 'forever'。 - 但我想不出没有更好方法的用例。