2010-12-16 18 views
0

我在小MyISAM表上工作 - 約30k條目,大小 - 10MB。其中一個字段是varchar(500+),因爲我使用utf8_unicode_ci我無法索引這個字段(我打1000個字節的限制),同時我需要根據這個字段執行大量的「get_or_create」查詢。我正試圖優化數據庫,但事情仍然緩慢。MyISAM密鑰長度限制,試圖加快與字段的MD5的東西

這是一個很好的解決方案來創建額外的字段,它將保存varchar的值的md5並將其索引/用於查找?有沒有人嘗試過這種方法?

+0

你在varchar列中存儲什麼樣的數據?給我們一些具體的例子。 – Theo 2010-12-16 20:55:15

+0

該字段包含指向網站 – Riz 2010-12-16 21:17:16

回答

1

對我來說,使用這樣一個寬列作爲一個關鍵似乎是一個壞主意,但除了你可以絕對做你喜歡的東西。你甚至不需要使用MD5,你需要的只是一個散列函數,它幾乎不產生碰撞,但唯一性不是必需的。 CRC32產生一個小值,並且非常快。

說你的表是這樣的:

CREATE TABLE data (lots_of_text VARCHAR(500)); 

它改成這樣:

CREATE TABLE data (text_hash INT, lots_of_text VARCHAR(500), INDEX (text_hash)); 

,當你插入行,你做的事:

INSERT INTO data (lots_of_text, text_hash) 
VALUES ("lots and lots of text", CRC32("lots and lots of text")); 

,然後你可以檢索像這樣的行:

SELECT lots_of_text FROM data 
WHERE text_hash = CRC32("lots and lots of text") 
AND lots_of_text = "lots and lots of text"; 

查詢將使用索引上text_hash,但由於CRC32不會產生你還需要檢查lots_of_text領域平等的獨特價值 - 但查詢仍將快,因爲最多是幾排將具有相同哈希值。

這樣做的一個變種是使用前50個字符左右作爲散列,具有相同前50個字符的行數很可能很低。

+0

的鏈接WHERE text_hash = CRC32(「許多文本」)AND lots_of_text =「許多文本」; - thx,這看起來像是一個好主意,另外使用文本來散列。 – Riz 2010-12-16 23:11:37