2009-02-02 75 views
25

假設我想使用散列作爲ID而不是數字。將它們作爲BINARY存儲在非二進制文件中是否會帶來性能優勢?針對散列ID的非二進制的MySQL二進制文件

CREATE TABLE `test`.`foobar` (
    `id` CHAR(32) BINARY CHARACTER SET ascii COLLATE ascii_bin NOT NULL, 
    PRIMARY KEY (`id`) 
) 
CHARACTER SET ascii; 
+0

您能更具體地瞭解您所尋找的「優勢」嗎?您是否在優化空間,性能,易用性或獨特價值的範圍? – 2009-02-03 20:38:25

+0

我主要對性能優勢感興趣,因爲空間幾乎是空閒的,128位值是我將BIGINT用作主鍵的值範圍的兩倍。 – Gumbo 2009-02-03 21:13:04

回答

28

是的。通常,一個散列摘要被存儲爲十六進制數字的ASCII表示,對於單詞「散列」的例子是MD5:

0800fc577294c34e0b28ad2839435945 

這是一個32個字符的ASCII字符串。

但MD5真的會產生一個128位的二進制散列值。這應該只需要16個字節存儲爲二進制值而不是十六進制數字。所以你可以通過使用二進制字符串獲得一些空間效率。

CREATE TABLE test.foobar (
    id BINARY(16) NOT NULL PRIMARY KEY 
); 

INSERT INTO test.foobar (id) VALUES (UNHEX(MD5('hash'))); 

回覆。你的意見是你比空間效率更關心性能:

我不知道任何理由,BINARY數據類型會比CHAR更快。

如果您有效地使用高速緩存緩衝區,那麼性能可以是性能優勢的一半。也就是說,如果字符串是以十六進制存儲相同值所需的CHAR大小的一半,則給定數量的高速緩存可以存儲兩倍的BINARY數據行。同樣,該列索引的高速緩存內存可以存儲兩倍。

結果是更有效的緩存,因爲隨機查詢有更大的機會擊中緩存的數據或索引,而不需要磁盤訪問。緩存效率對於大多數數據庫應用程序非常重要,因爲通常瓶頸是磁盤I/O。如果您可以使用高速緩存來降低磁盤I/O的頻率,那麼對於降低數據類型或其他數據類型的選擇而言,這是一個更大的突破。

至於存儲在BINARY和BIGINT中的哈希字符串之間的差異,我會選擇BIGINT。緩存效率會更高,並且在64位處理器上整數運算和比較應該非常快。

我沒有測量結果來支持上述索賠。選擇一種數據類型而非另一種數據類型的淨收益取決於數據庫和應用程序中的數據模式和查詢類型。爲了得到最準確的答案,您必須嘗試兩種解決方案並衡量差異。


Re。你的假設是二進制字符串比較是比默認不區分大小寫字符串比較快,我試着下面的測試:

mysql> SELECT BENCHMARK(100000000, 'foo' = 'FOO'); 
1 row in set (5.13 sec) 

mysql> SELECT BENCHMARK(100000000, 'foo' = BINARY 'FOO'); 
1 row in set (4.23 sec) 

所以二進制字符串比較是比不區分大小寫字符串比較快17.5%。但請注意,在對這個表達式進行1億次評估後,總差值仍然不到1秒。雖然我們可以測量速度的相對差異,但速度的絕對差異實際上並不重要。

所以我要重申:

  • 措施,不要猜測或假設。你的教育猜測在很多時候都是錯誤的。在你做出每一個改變之前和之後測量,所以你知道它有多大的幫助。
  • 投資你的時間和注意力,你會得到最大的回報。
  • 不要爲小東西出汗。當然,一個微小的差異加上了足夠的迭代,但是考慮到這些迭代,具有更大絕對收益的性能改進仍然是可取的。
6

the manual

The BINARY and VARBINARY types are similar to CHAR and VARCHAR, except 
that they contain binary strings rather than non-binary strings. That is, 
they contain byte strings rather than character strings. This means that 
they have no character set, and sorting and comparison are based on the 
numeric values of the bytes in the values. 

由於CHAR(32)BINARY導致BINARY到發動機罩下被創建(32)柱,好處是,它會花費較少的時間通過排序列,並且如果列被索引,則查找對應行的時間可能會更少。

+0

感謝您的回答。你不會碰巧知道一些關於這個的數字嗎? – Gumbo 2009-02-03 19:27:36