如果我有一个列,则设置为主索引,并设置为INT。
如果我没有将其设置为自动增量并且只插入其中唯一的随机整数,那么与自动增量相比,这是否会减慢未来的查询?
如果我在一个主要且唯一索引为INT的表上运行 OPTIMIZE ,它会加快速度吗? (假设只有2列,第二列只是一些INT值)
(主要担心的是自动增量的上限,因为我的表中有大量的添加和删除)
答案 0 :(得分:1)
如果我没有将其设置为自动增量并且只插入其中唯一的随机整数,那么与自动增量相比,这会减慢它吗?
在MyISAM
中,它实际上会加速(略微)。
在InnoDB
中,由于页面拆分,这可能会导致INSERT
操作减慢。
这当然意味着你的数字真的很独特。
如果我优化一个主要且唯一索引为INT的表,它会加快速度吗? (假设只有2列,第二列只是一些INT值)
AUTO_INCREMENT
和INT
可以一起使用。
OPTIMIZE TABLE
将压缩表和索引,释放已删除行和页面拆分的剩余空间。如果您在桌面上进行了大量DELETE
次操作或INSERT
无序(例如在随机数字的解决方案中),这将有所帮助。
它还会使索引页面的逻辑和物理顺序相互一致,这将加快PK
(PK 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需要显式生成,而不是数据库照顾它。)