2009-10-21 31 views
2

所以我有一個MySQL數據庫表中有一列包含一個字符串。給定一個目標字符串,我想查找所有包含在目標中的子字符串的行,即所有目標字符串爲該列的超字符串的行。目前我正在使用以下查詢:如何爲超弦查詢優化數據庫?

SELECT * FROM table WHERE 'my superstring' LIKE CONCAT('%', column, '%') 

我的擔心是,這不會縮放。我目前正在做一些測試,看看這是否是一個問題,但我想知道是否有人對替代方法有任何建議。我簡要介紹了MySQL的全文索引,但它似乎也適用於在數據中查找子字符串,而不是查找數據是否存在於給定的字符串中。

+0

嗯,我在那裏非常有意識地選擇了「超弦」這個詞。我理解一個子串查詢是爲了查找列中包含一個包含目標字符串的字符串的行。 – Benno 2009-10-21 23:44:36

+0

你可以說超級字符串中的字符長度和/或範圍是否存在「問題域」限制? – 2009-10-21 23:54:21

+0

...以及'列'字段中子字符串的可能長度可能也是如此。 – 2009-10-21 23:55:33

回答

0

好吧,看來答案是你沒有。這種類型的索引通常是不可用的,如果你想在MySQL數據庫中使用它,你需要創建你自己的MySQL擴展。我正在追求的另一種方法是在我的應用程序中進行索引。

感謝大家的迴應!

1

你可以創建一個帶有全文索引的臨時表,並在其中插入'我的超級串'。然後,您可以在永久表的連接查詢中使用MySQL的全文匹配語法。你仍然會對永久桌面進行全表掃描,因爲你將檢查每一行的匹配情況(你想要什麼,對吧?)。但至少'我的超弦'將被編入索引,因此它可能會比你現在擁有的更好。

或者,您可以考慮簡單地從table中選擇column並以高級語言執行匹配。根據table中有多少行,這種方法可能更有意義。將繁重任務卸載到客戶端服務器(Web服務器)通常可能是一個勝利,因爲它減少了數據庫服務器的負載。

+0

是的,我正在研究那個。目前,我正在建立一個測試平臺來獲得一些性能數據,並看看需要什麼。 – Benno 2009-10-21 23:46:49

0

如果你的superstrings是URL,並且你想在其中找到子字符串,那麼知道你的子字符串是否可以錨定在點上將是有用的。

例如,你有超弦:

www.mafia.gov.ru www.mymafia.gov.ru www.lobbies.whitehouse.gov

如果規則包含「黑手黨」和你想要第一個2匹配,然後我會說不適用。

否則,你可以解析你的網址爲:['www','mafia','gov','ru' ] 然後,查找表格中的每個元素會容易得多。

+0

我可以在主機名的情況下做到這一點,但它在整個URL的情況下沒那麼有用。好主意,但。 – Benno 2009-10-22 21:48:16

0

我使用需要足夠強大的視圖創建搜索解決方案,以滿足客戶需求。例如:

 

CREATE TABLE tblMyData 
(
MyId bigint identity(1,1), 
Col01 varchar(50), 
Col02 varchar(50), 
Col03 varchar(50) 
) 

CREATE VIEW viewMySearchData 
as 
SELECT 
MyId, 
ISNULL(Col01,'') + ' ' + 
ISNULL(Col02,'') + ' ' + 
ISNULL(Col03,'') + ' ' AS SearchData 
FROM tblMyData 

SELECT 
t1.MyId, 
t1.Col01, 
t1.Col02, 
t1.Col03 
FROM tblMyData t1 
INNER JOIN viewMySearchData t2 
ON t1.MyId = t2.MyId 
WHERE t2.SearchData like '%search string%' 

 

如果他們再決定將列添加到tblMyData,他們希望搜索,然後加入到「AS SearchData」部分中的新colums修改viewMysearchData那些列。

如果他們決定在搜索中有兩列很多,那麼只需通過從「AS SearchData」部分刪除不需要的列來修改viewMySearchData