mysql自动递增主键用完

mysql自动递增主键用完,mysql,Mysql,我维护一个带有ID自动递增主键的表。当我删除一个条目并重新添加一个条目时,新条目不会采用上一个条目的ID,而是会再次递增1。这正常吗?是否建议不要改变这种行为?我只是觉得这是在创建一个不可伸缩的系统,因为它最终可能会耗尽索引。这是正常的。不要担心ID是连续的。没关系。根据您期望的记录数量,您可能希望确保它是bigint类型,但在大多数情况下int应该可以。这取决于您计划拥有的记录数量以及删除和添加记录的频率,但如果这是一个问题,请使用bigint主键 还有其他选择,例如使用GUID,如果您真的担

我维护一个带有ID自动递增主键的表。当我删除一个条目并重新添加一个条目时,新条目不会采用上一个条目的ID,而是会再次递增1。这正常吗?是否建议不要改变这种行为?我只是觉得这是在创建一个不可伸缩的系统,因为它最终可能会耗尽索引。

这是正常的。不要担心ID是连续的。

没关系。根据您期望的记录数量,您可能希望确保它是
bigint
类型,但在大多数情况下
int
应该可以。

这取决于您计划拥有的记录数量以及删除和添加记录的频率,但如果这是一个问题,请使用
bigint
主键


还有其他选择,例如使用GUID,如果您真的担心行数不足,但我从未遇到过实际需要
bigint
的情况,我只是偶尔在volitle表上使用它们以确保安全。

这是设计的,数百万个数据库都有这样的主键和整数键

如果删除90%的插入,则在4亿行之后,密钥将用完1)
如果你这样做了,你可以做一个

ALTER TABLE `test`.`table1` MODIFY COLUMN `item_id` BIGINT UNSIGNED NOT NULL
, ROW_FORMAT = DYNAMIC;
其中,
item\u id
列将是您的主键。
在此之后,您再也不用担心密钥空间会耗尽

不要试图从bigint主键开始

  • 这将使您所有的查询都变慢
  • 这会使桌子变大
  • 在InnoDB上,主键包含在每个二级索引中,使一个小主键的插入速度大大加快
  • 对于大多数桌子,你永远不会需要它
  • 如果您知道您的大表的行数将超过整数所能容纳的行数,那么一定要将其设置为bigint,但您应该只对真正需要它的表执行此操作。特别是在InnoDB表上

    不要使用GUID,这只是浪费了大量空间,99,99%的时间都在无缘无故地减慢速度。



    1) 使用未签名的!整数作为主键。

    用户niceguy07上传他的小猫的照片。图片保存为000012334.jpg,因为您使用主键作为文件名,而不是将不受信任的用户数据放入其中(这是一个好主意)

    niceguy07向他的约会对象发送一个带有?picture_id=12334的链接

    niceguy07删除了他的小猫照片,用户fatperv08上传了一张他只戴着蝙蝠侠面具的照片

    您的数据库重用主键,因此,现在带有?picture_id=12334的链接指向一张穿着蝙蝠侠面具的裸体胖perv的图片,这是很不幸的

    重新使用已删除记录的主键值是一个非常糟糕的主意。事实上,如果主键因在以下情况下使用而从数据库中泄漏,则这是一个bug:

    • 网址
    • 文件名
    • 与文件中的其他数据一起转储

    事实上,由于执行上述所有操作非常有用,不重用主键ID是一个好主意。..

    数据库设计中的主键应视为所表示信息的唯一标识符。通过从表中删除一个ID,您实际上是在说该记录将不再存在。如果有什么东西取而代之,你是在说这张唱片复活了。现在从技术上讲,当您首先删除它时,您也应该删除所有外键引用。在这一点上,人们可能会说,既然所有的痕迹都消失了,那么就没有理由不让某些东西取代它。那么,备份呢?假设您无意中删除了该记录,但最终被其他内容替换,您将无法轻松恢复该记录。这还可能导致回滚问题。因此,重用ID不仅是不必要的,而且在数据库设计理论中是根本错误的。

    不确定MySQL是否容易出现这种情况,但GUID对于索引维护来说可能会有问题。可能是顺序GUID?@n8wrl-从本质上讲,所有数据库都无法索引非常随机的值。如果您使用guid,则必须使其连续(例如梳形guid)以使其可行。您使用的整数数据类型是有符号还是无符号??你问这个问题是对的,因为我看到一份时事通讯的选择退出表单停止运行,因为它无法再处理请求。是的,我只是想我会更彻底地冲出这个问题的概念性质。对于现实世界的例子,我必须+1。有些管理员直到太晚才意识到这一点。最好不要在文件名中公开主键。。。我知道你的只是一个简单的例子,但最好使用timestamp+uuid(如果不是基于当时创建的_,则需要一个额外的列来跟踪文件名)。@user58446是的,这是一个简单的例子,旨在回答这个问题。你的建议提供了额外的防御PK猜测攻击的盾牌,这很好。