【问题标题】:MySQL AUTO_INCREMENT by group using InnoDB or alternativesMySQL AUTO_INCREMENT 按组使用 InnoDB 或替代方案
【发布时间】:2012-03-12 00:14:11
【问题描述】:

我正在使用 MySQL 数据库设计一个 Web 应用程序,但我被困在我的数据库设计的一个要点上。

这是我想使用 InnoDB 引擎存储的数据类型的示例:

user_id   account_id
1         1
1         2
1         3
2         1
2         2
3         1

从上面可以清楚地看出,我希望 account_id 为每个单独的用户自动递增。以下是我遇到的一些问题:

  1. 我确实知道要自动执行此操作,我可以使用 MyISAM 引擎,但在阅读了一些内容后,我意识到当更新发生时,该引擎将锁定整个表,而不仅仅是一排。这对我没有好处。此外,MyISAM 不强制执行引用完整性,我非常希望保留这一点。

  2. 我已经阅读了其他人对此问题的解决方案,他们使用了触发器。当然,我可以使用触发器,但我不是很喜欢触发器,因为它们比一个表更难维护。

  3. 我可能会使用一个序列,但我认为为每个用户维护一个单独的序列会很丑。

  4. 我可以简单地使用唯一的 AUTO_INCREMENT 而不考虑 user_id,这样会很好用。有两点我不喜欢: 1. 这样,我的 smallint 可能会增长为 int 或 bigint,这将需要更多的存储空间。我知道存储空间很便宜,但我仍然想尽量减少它。 2. 按组自动递增会更干净。

我想得到那些遇到并成功解决这个问题的用户的一些反馈/意见。也许,还有另一种我没有想到的解决方案。也许,还有另一种我没有想到的整理表格的方法。

【问题讨论】:

  • 对于大约 650000 名用户,如果您从 SMALLINT 移动到 INT,它只会增加 1.3MB。我看不到更改为INT(或MEDIUMINT)会导致存储问题。在这里使用自动增量列是最好的主意。如果您不想锁定整个表,请尝试使用 InnoDB - IIRC 它只锁定行。

标签: mysql innodb auto-increment myisam


【解决方案1】:

使用简单的 AUTO_INCREMENT 并忽略存储:

  • 如果您扩展到一百万用户,每个用户有 1000 个帐户,您将 需要大约。 3MB 额外存储空间。
  • 单字段主索引(主要在实际存储中排序!)的性能优势将比那一点存储更有价值

【讨论】:

  • 我想我现在确信使用唯一的 AUTO_INCREMENT 并没有那么糟糕,即使这确实意味着我必须从 SMALLINT 切换到 INT。谢谢!
猜你喜欢
  • 2015-10-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-17
  • 2016-11-08
  • 2016-03-19
  • 1970-01-01
相关资源
最近更新 更多