MYSQL自动增量一列还是只有一个整数,区别?

时间:2010-12-27 15:32:18

标签: mysql

如果我有一个列,则设置为主索引,并设置为INT。

如果我没有将其设置为自动增量并且只插入其中唯一的随机整数,那么与自动增量相比,这是否会减慢未来的查询?

如果我在一个主要且唯一索引为INT的表上运行 OPTIMIZE ,它会加快速度吗? (假设只有2列,第二列只是一些INT值)

(主要担心的是自动增量的上限,因为我的表中有大量的添加和删除)

3 个答案:

答案 0 :(得分:1)

  

如果我没有将其设置为自动增量并且只插入其中唯一的随机整数,那么与自动增量相比,这会减慢它吗?

MyISAM中,它实际上会加速(略微)。

InnoDB中,由于页面拆分,这可能会导致INSERT操作减慢。

这当然意味着你的数字真的很独特。

  

如果我优化一个主要且唯一索引为INT的表,它会加快速度吗? (假设只有2列,第二列只是一些INT值)

AUTO_INCREMENTINT可以一起使用。

OPTIMIZE TABLE将压缩表和索引,释放已删除行和页面拆分的剩余空间。如果您在桌面上进行了大量DELETE次操作或INSERT无序(例如在随机数字的解决方案中),这将有所帮助。

它还会使索引页面的逻辑和物理顺序相互一致,这将加快PKPK BETWEEN val1 AND val2)上的完整扫描或远程查询,但对于随机几乎无关紧要寻道。

  

(主要担心的是自动增量的上限,因为我的表中有大量的添加和删除)

BIGINT UNSIGNED(也可以与AUTO_INCREMENT一起使用)可能会保留最多18446744073709551615的值。

答案 1 :(得分:1)

自动增量整数的上限为18446744073709551615

http://dev.mysql.com/doc/refman/5.1/en/numeric-types.html

你真的达到了这样的限度吗?如果你这样做,允许MySQL在前一个数字中添加一个是一种难以改进的算法。

答案 2 :(得分:1)

AUTOINCREMENT的上限是相应列中数字类型的上限。即使使用INT UNSIGNED,也可能需要一段时间才能完成;使用BIGINT它将很难达到(并且严肃地说,你在构建什么样的应用程序,每行4个额外的字节太多了?)。所以,如果你要达到这个限制,你会用自动增量或没有它来击中它。

另外,虽然没有AUTOINCREMENT会使你的插入速度加快一点,但我愿意打赌,生成一个独特的整数而不是AUTOINCREMENT的代码会比自动增量减慢代码的速度(生成当你的桌子填满时,随机的非冲突的数字将变得越来越难。)

换句话说,IMNSHO看起来像是过早优化,并且不会显着促成更快的代码(如果有的话),但它会使其更难维护(因为PK需要显式生成,而不是数据库照顾它。)