增加一个主键

我运行了一个比较,使用MySQL 5.6将行插入到一个空表中。

每个表都包含一个由AUTO_INCREMENT串行递增的列( 升序 )和一对接收随机唯一编号的列( random_1random_2 )。

在第一个测试中, 升序是PRIMARY KEY,( random_1random_2 )是KEY。 在第二个测试中,( random_1random_2 )是PRIMARY KEY, 升序是KEY。

CREATE TABLE clh_test_pk_auto_increment (
   ascending_pk       BIGINT UNSIGNED NOT NULL AUTO_INCREMENT, -- PK
   random_ak_1        BIGINT UNSIGNED NOT NULL,                -- AK1
   random_ak_2        BIGINT UNSIGNED,                         -- AK2
   payload            VARCHAR(40),
   PRIMARY KEY        ( ascending_pk ),
   KEY                ( random_ak_1, random_ak_2 )
)  ENGINE=MYISAM 
   AUTO_INCREMENT=1 
   ;

CREATE TABLE clh_test_auto_increment (
   ascending_ak       BIGINT UNSIGNED NOT NULL AUTO_INCREMENT, -- AK
   random_pk_1        BIGINT UNSIGNED NOT NULL,                -- PK1
   random_pk_2        BIGINT UNSIGNED,                         -- PK2
   payload            VARCHAR(40),
   PRIMARY KEY        ( random_pk_1, random_pk_2 ),
   KEY                ( ascending_ak )
)  ENGINE=MYISAM 
   AUTO_INCREMENT=1 
   ;

一致的是,第二个测试(自动增量列不是PRIMARY KEY)的运行速度稍快一些 - 5-6%。 任何人都可以推测为什么?


主键通常用作实际存储数据的顺序。 如果主键递增,则仅附加数据。 如果主键是随机的,那就意味着必须移动现有数据才能使新行进入正确的顺序。 基本(非主键)索引通常在内容上要轻得多,并且可以以更少的开销快速移动。

我知道这对其他DBMS来说是正确的。 我冒昧猜测MySQL在这方面的工作原理类似。

UPDATE

正如@BillKarwin在下面的评论中所述,这个理论对于MyISAM表格不适用。 作为一个后续理论,我会参考下面的@ KevinPostlewaite的答案(他从此被删除),问题在于PRIMARY KEY上缺少AUTO_INCREMENT - 它必须是唯一的。 使用AUTO_INCREMENT可以更容易地确定这些值是唯一的,因为它们保证了增量。 对于随机值,可能需要一些时间才能真正走索引来做出这个决定。

链接地址: http://www.djcxy.com/p/90379.html

上一篇: INCREMENT on a PRIMARY KEY

下一篇: MySQL: is out