2010-02-16 128 views
1

我有一個數據庫,它包含一個表中的URL(以及有關URL的其他許多詳細信息)。我有另一個表,它存儲了我將用於在每個鏈接上執行搜索的字符串。我的數據庫會很大,我期待鏈接表中至少有500萬條記錄。搜索大型數據庫

與用戶通信的應用程序是用PHP編寫的。我需要一些建議,關於如何在所有模式(n X m個搜索)上搜索所有鏈接,同時不要在服務器上造成高負載,也不會失去速度。我希望它能以高速度和低資源運作。如果你有任何提示,僞代碼的建議,他們都歡迎。

現在我不知道是否使用SQL命令來執行這些搜索,並從PHP獲得一些幫助,或者完全在PHP中執行。

回答

0

首先我建議你重新考慮佈局。對每個用戶運行這個查詢似乎有點不必要,而是嘗試創建一個結果表,其中您只需插入來自該查詢的運行結果表的結果表,然後每次模式更改。

否則,請確保您在需要的字段上設置了索引(全文)。對於查詢本身,你可以加入表:

SELECT 
    yourFieldsHere 
FROM 
    theUrlTable AS tu 
JOIN 
    thePatternTable AS tp ON tu.link LIKE CONCAT('%', tp.pattern, '%'); 
0

我會說,你肯定很想要做的是,在SQL代碼,而不是PHP代碼。同時搜索URL的字符串將是一個漫長的操作,所以也許某種形式的哈希會很好。我之前看到有人使用Zobrist hash的變體(谷歌會帶來一大堆結果)。

希望這會有所幫助,

丹。

0

在數據庫中儘可能多地進行搜索。如果你最終得到一個nxm結果集,並且以至少500萬次點擊開始,那麼通過連線(或者套接字,但是你連接到db)反覆咕嚕的很多數據只是爲了最終結束每次扔掉大部分(很多?)。即使數據庫的本地搜索功能(比如匹配,正則表達式,全文等等)不能勝任,在發送給客戶端(您的代碼)之前,剔除不需要的行仍然有用。

0

您必須在數據庫中優化您的表格。使用md5散列。使用md5的新列將使用索引和更快找到的文本。

但是,如果您使用LIKE'%text%',它並沒有幫助。

您可以使用Sphinx或Lucene。