2013-03-11 49 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