【发布时间】:2010-12-27 15:32:18
【问题描述】:
如果我有一列,设置为主索引,设置为INT。
如果我不将其设置为自动增量,而只是将唯一的随机整数插入其中,与自动增量相比,这会减慢未来的查询速度吗?
如果我在主索引和唯一索引为 INT 的表上运行 OPTIMIZE 会加快速度吗? (假设只有 2 列,第二列只是一些 INT 值)
(主要担心的是自动增量的上限,因为我的表中有很多添加和删除)
【问题讨论】:
标签: mysql
如果我有一列,设置为主索引,设置为INT。
如果我不将其设置为自动增量,而只是将唯一的随机整数插入其中,与自动增量相比,这会减慢未来的查询速度吗?
如果我在主索引和唯一索引为 INT 的表上运行 OPTIMIZE 会加快速度吗? (假设只有 2 列,第二列只是一些 INT 值)
(主要担心的是自动增量的上限,因为我的表中有很多添加和删除)
【问题讨论】:
标签: mysql
如果我不将其设置为自动增量,而只是在其中插入唯一的随机整数,与自动增量相比,这会减慢速度吗?
在MyISAM 中,它实际上会加速它(略微)。
在InnoDB 中,由于页面拆分,这可能会减慢INSERT 操作。
这当然意味着你的号码是独一无二的。
如果我优化一个主索引和唯一索引为 INT 的表,它会加快速度吗? (假设只有 2 列,第二列只是一些 INT 值)
AUTO_INCREMENT 和INT 可以一起使用。
OPTIMIZE TABLE 将压缩您的表和索引,释放删除的行和页面拆分留下的空间。如果您在桌子上有很多 DELETE 操作或 INSERT 乱序(例如在您的解决方案中使用随机数),这将有所帮助。
它还将使索引页的逻辑和物理顺序相互保持一致,这将加快对PK (PK BETWEEN val1 AND val2) 的全面扫描或范围查询,但对于随机搜索几乎没有影响。
(主要担心的是自动增量的上限,因为我的表中有很多添加和删除)
BIGINT UNSIGNED(也可以与AUTO_INCREMENT 一起使用)最多可以容纳18446744073709551615 的值。
【讨论】:
自增整数的上限是18446744073709551615:
http://dev.mysql.com/doc/refman/5.1/en/numeric-types.html
你真的达到这个极限了吗?如果你这样做了,让 MySQL 在前一个数字上加一个是一种几乎无法改进的算法。
【讨论】:
AUTOINCREMENT 的上限是相应列中数字类型的上限。即使使用INT UNSIGNED,这也可能需要一段时间才能完成;使用BIGINT 将很难达到这一点(而且说真的,你在构建什么样的应用程序,每行额外增加 4 个字节太多了?)。所以,如果你要达到这个限制,你可以用自动增量来达到它,也可以不用它。
另外,虽然没有 AUTOINCREMENT 会稍微加快插入速度,但我敢打赌,任何生成唯一整数而不是 AUTOINCREMENT 的代码都会比自动增量减慢代码速度(生成随机的不冲突的数字会随着你的桌子填满而变得越来越难)。
换句话说,IMNSHO 这看起来像是过早的优化,并且不会显着提高代码速度(如果有的话),但它会降低它的可维护性(因为需要显式生成 PK,而不是数据库照顾它)。
【讨论】: