2011-10-10 71 views
2

我有一個查詢,比較多列的值,並返回結果。現在我必須添加另一列進行比較,這是一個文本字段,並且沒有編入索引。現在我正在考慮不要這樣做,只需添加一個稱爲散列的列,這將成爲這些列的散列,然後我只能將這與我的代碼爲這些相同列生成的散列進行比較。搜索哈希mysql列

1)我想知道這會導致任何性能增強,這是多麼有益?

2)mysql是否提供任何函數來散列列和存儲結果的組合,以便我可以散列已存在的列而無需爲此編寫單獨的代碼。

3)散列哪個散列,MD5或SHA?

4)這是一個好主意嗎?

我有幾百萬條記錄,預計在幾個月內會產生幾百萬條記錄,這些記錄會產生獨特的結果嗎?

感謝, 戒

回答

0

嘗試:

MD5(CONCAT(field1,field2,field333); 
1

1),這可能導致性能增強,雖然我懷疑你手動重新發明已經在數據庫的索引引擎中實現的.. 。所以我會建議使用內置的索引機制...

2)是的 - 它有MD5SHA/SHA1 SQL函數散列字符串,所以你需要轉換/施放要散列到一個字符串的任何值...

3)這取決於你的數據 - 我猜SHA是一個不錯的選擇......

4)我不認爲所以......這是對數據庫已經內置的內容的再造,並不意味着你擺脫了索引......如果你希望它能夠很好地執行,你將不得不用索引值來對索引進行索引。 ..

5)它是不知道是完全獨特的,但不太可能產生衝突......

我會重新考慮的方法,並使用複合指數。如果一個複合索引不適合你的需要創建一個包含連接值和索引的列...

+0

謝謝@Yahia,我關心的是問題的列是文本類型,幷包含大字符串。如果我爲百萬條記錄編制索引,則需要大量內存來存儲這些索引。如果我可以將這個列與其他已使用的列一起散列,然後索引該散列列,那麼應該使查詢執行得更快。 – Harsha

+0

按照我的答案 - 你可以做到這一點,它可能會使它快一點...但我不會推薦它...空間相當便宜這些天,通常不是一個參數重新發明輪恕我直言.. 。 – Yahia