mysql - Mysql 时间戳和 AUTO_INCREMENT 作为主键
问题描述
我正在考虑为我的数据编制索引的最佳方式。使用时间戳作为我的主键是个好主意吗?无论如何我都在保存它,我想保存一些列。由于性能原因,时间戳应该是整数而不是日期时间列。此外,我不想在短时间内(两秒之间)限制数据量。因此,我想到了一个额外的 AUTO_INCREMENT 列。现在我有一个唯一的键(时间戳和 AI),我可以使用命令“LAST_INSERT_ID”轻松获取当前插入的 id。是否可以每秒/有新时间戳时重置 AI 计数器?或者是否可以检测是否存在具有相同时间戳的数据集并增加AI值(我仍然希望能够使用LAST_INSERT_ID)。
请分享一些想法。
解决方案
由于性能原因,时间戳应该是整数而不是日期时间列。
我认为您相信datetime
存储为字符串。它以数字的形式存储非常有效,并且比整数具有更广泛的范围和更高的准确性。
使用整数可能会降低性能,因为数据库可能无法正确索引它以用作时间戳。这将使查询复杂化,因为如果不先将整数转换为日期时间,您将无法使用全套日期和时间函数。
使用适当的日期/时间类型,对其进行索引,然后让数据库对其进行优化。
此外,我不想在短时间内(两秒之间)限制数据量。因此,我考虑了一个 [附加] AUTO_INCREEMENT 列。
这似乎违背了“保存一些列”的观点。现在你的主键是两个整数。更糟糕的是,它是一个复合键,它需要所有引用来存储这两个值,这增加了存储要求和复杂的连接。
确定下一个主键所需的所有额外工作都可以在插入触发器中完成,但现在您为每个插入增加了复杂性和额外工作。
使用时间戳作为我的主键是个好主意吗?
主键应该是 A) 唯一且 B) 不可变的。时间戳不是唯一的,您可能需要更改它。
您的主键不太可能成为性能或存储瓶颈。除非您有充分的理由,否则请坚持使用简单、自动递增的大整数。一个大整数,因为 20 亿比你想象的要小。
MySQL 将其封装在serial
其中bigint unsigned not null auto_increment unique
。
推荐阅读
- javascript - JavaScript:查找字符串中所有出现的子字符串索引
- amazon-web-services - 是否可以通过会话管理器从我的桌面等外部源使用 SSH 连接到实例。如果是这样,怎么办?
- mysql - 在 SQL 中显示自生效日期起的包裹价格
- css - 我怎样才能不让我的幻灯片菜单的宽度影响我在css中的主页的宽度
- elasticsearch - Grafana 彩色日志和 elasticsearch lucene 查询
- html - 我的 HTML 文件找不到任何其他文件并返回 404
- javascript - 拒绝执行脚本,因为它的 MIME 类型 ('image/gif') 不可执行
- python - 处理错误:(gcloud.functions.deploy) OperationError: code=3, message=Function failed on loading user code
- visual-studio - 像 VS19 这样的 Flutter IDE“与 Mac 配对”能力?
- arrays - 使用从 JSON 数组到 JOLT 的另一个值的匹配提取特定值