2016-01-05 55 views
1

我需要用一個非常簡單的表結構來保存MySQL-DB中的xml字符串。在大型mysql數據庫中查找長字符串

xml_ID int(10), xml text 

當插入一個新的字符串,我想檢查重複。我的數據庫包含幾乎超過10K的項目,並且WHERE的比較非常緩慢。所以我決定添加一個列並填充字符串的校驗和。

xml_ID int(10), xml text, md5 binary(32) 

因爲校驗和不是一個字符串biunique我不能只比較校驗和。所以我仍然需要比較字符串本身。

現在我的問題:什麼是更快/更好?使用子查詢像

SELECT xml_ID 
FROM table 
WHERE 
    md5=MD5('<content>hello</content>') AND 
    xml='<content>hello</content>' 

或請求:含有2 WHERE等條件A選擇請求

SELECT xml_ID 
FROM (
    SELECT * 
    FROM table 
    WHERE md5=MD5('<content>hello</content>') 
    ) AS t 
WHERE xml='<content>hello</content>' 

我測試到目前爲止,但兩者的請求需要幾乎相同的時間的結果。

校驗和是否必要?

我也開放給任何其他建議...

謝謝...

+0

第一個版本應該快一點。如果你創建了校驗和並且仍然需要字符串比較,那麼它有什麼意義呢?你在這張桌子上有沒有索引? –

+0

xml_ID是主鍵,沒有其他指標,沒有其他指標.....和字符串比較是必要的,因爲校驗和不是biunique ......我的想法使用校驗和會減少直接結果字符串比較 –

+0

如果可用,數據庫將首先使用MD5索引。第一個查詢會稍微快一點。 –

回答

0

即使是微薄的MD5是不太可能有重複的絕對比你贏在巨型彩票同時小行星撞擊地球。

所以,簡單地

SELECT ... 
    FROM ... 
    WHERE md5 = MD5(...); 

,並有INDEX(md5) - 缺少索引的可能是爲什麼它是緩慢的。

在一個9萬億md5的表中,9萬億隻有一個機會,你對不同的字符串擁有相同的兩個md5。

小心 - 當您的md5索引太大而無法緩存時,性能會受到影響。 (10K行應該不成問題)。

相關問題