2013-12-19 53 views
1

使用PHP,我有一個包含Actions表的MySQL數據庫,其中用戶可以選擇將操作分配給其網站中的某些頁面。每個這樣的賦值都會生成一個動作行,其中包含一個唯一的ActionId以及相應頁面的URL。PHP MySQL表按字符串搜索 - 使用散列?

稍後,在特定頁面的上下文中,我想知道是否有分配給該頁面的操作,並獲取(SELECT)適當的操作行。那時我知道我的頁面的URL,所以我可以用這個相對較長的字符串搜索Actions表。我懷疑這不是在數據庫中搜索的最佳方式。

我假設一個更好的方法是使用某種哈希將我的長URL字符串轉換爲整數,確保沒有兩個不同的URL被轉換爲相同的整數(這裏的加密不是問題)。有這樣一個PHP函數嗎?或者,有沒有更好的策略呢?

注意我已經看到這個:SQL performance searching for long strings - 但它似乎並沒有提出一個堅實的解決方案,除了提到md5(它散列成一個字符串,而不是整數)。

+0

爲什麼不使用頁面ID作爲參考?另外,'VARCHAR'不應該花費那麼長時間來搜索,它是'TEXT'類型,您應該爲大量搜索而擔心。還取決於你的數據庫的大小,它可以快速或緩慢地獄。 – casraf

+0

如果您的URL是唯一的,您可以在該列上創建一個UNIQUE索引並在其上進行搜索。 – Jon

+3

A *正確索引*欄的搜索速度非常快,幾乎與搜索字符串的長度無關。你是否真的嘗試過它,並且在考慮這樣複雜的方案之前證明它太慢了? – deceze

回答

0

如果您向該列添加索引,數據庫應該爲您考慮效率,並且URL的長度應該沒有區別。

1

哈希策略是一個很好的策略。

處理URL字符串可能確實是一個問題,因爲它們可能很長,並且包含很多特殊字符,這些字符對MySQL搜索(REGEXPLIKE)總是有問題。

這就是哈希解決問題的原因。即使md5這不是一個很好的散列函數來散列密碼(因爲它不再安全),這是很好的哈希URL。

這種方式你將有http://www.stackoverflow.com改爲4c9cbeb4f23fe03e0c2222f8c4d8c065,這將是非常獨特的(除非你非常非常不幸)。

SELECT * FROM Actions where md5_url=? 

?是當前URL的md5($url)

一旦你有你md5_url場設置,你可以搜索。

當然一定要在你的md5_url字段設置索引:

ALTER TABLE Actions 
ADD md5_url varchar(32), 
ADD KEY(md5_url);