2013-03-11 47 views
2

我运行了一个比较,使用MySQL 5.6将行插入空表中。在PRIMARY KEY上使用AUTO_INCREMENT的MySQL性能

每个表包含在被串联AUTO_INCREMENT递增接收随机的,独特的数字的列(升序),和一对列(random_1random_2)。

在第一测试中,升序是PRIMARY KEY和(random_1random_2)是关键。在第二个测试中,(random_1,random_2)是PRIMARY 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 
    ; 

一致地,第二测试(其中,自动递增列的主键)运行速度稍快 - 5-6%。任何人都可以推测为什么?

+0

我可以推测,但是在你告诉我们“测试”是什么之前,没有什么意义。 – Hazzit 2013-03-11 21:06:29

+0

尽可能快地插入100万行。 – Chap 2013-03-11 21:25:44

+0

我不认为第二个测试会做你认为它的作用。看到这个:http://dba.stackexchange.com/questions/3467/mysql-why-is-auto-increment-limited-to-just-primary-keys – Hazzit 2013-03-11 22:10:07

回答

2

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

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

UPDATE

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

+0

不在MyISAM存储引擎中;主键和辅助键之间没有区别。 – 2013-03-11 21:35:45

+0

小学是隐含的独特的,次要的 - 至少在这个测试 - 没有被宣布为这样。 – Chap 2013-03-11 21:44:43

+0

@BillKarwin - MyISAM引擎不在主键上集群吗?提出了类似的答案[这里](http://stackoverflow.com/questions/5465233/mysql-is-out-of-order-inserts-into-pk-b-tree-slower-than-out-of-order -inserts),假定集群正在主键上完成... – PinnyM 2013-09-17 20:25:31