2011-09-07 68 views
1

我建立了一個名人照片網站。在達到10萬張照片後,我的業餘技能已經開始出現,需要很快磨光。一些簡單的查詢需要5-10秒才能返回!MySQL全文搜索並加入

我有一個文本框搜索功能,它將搜索「照片」表(標題和標題),「人」表,「關鍵字」表和「photoContributor」表。 「人」和「關鍵字」有兩個關係/關聯表,分別稱爲「photoPeople」和「photoKeyword」。

一個可能的用戶搜索結果可能是: 「Brad Pitt Angelina Jolie太陽鏡@MG」 - 這將返回包含Brad和Angelina在一起的所有照片,其中太陽鏡可以被貢獻者@MG看到和拍攝。

我很快就意識到我無法在「照片」表的「標題」和「標題」字段中使用INDEX,因爲我使用帶有「%」前綴的「LIKE」子句,而那些特定的字段設置爲「LONGTEXT」數據類型。因爲我在這些領域沒有索引,所以造成巨大的回報。因此,我相信我需要使用「FULLTEXT」搜索,然後我可以將「標題」和「標題」字段設置爲VARCHAR(2000),因爲迄今爲止最大的標題是1991個字符,仍然使用「INDEX」功能,這將有望加快速度。我也喜歡布爾函數來從搜索中刪除單詞。

我寫這個問題的原因是我在「JOINS」中完全沒用。我可以在一個表上寫一個「FULLTEXT」查詢,我可以使用左連接或右連接將兩個表連接在一起......但是因爲我擁有關聯表/關係表,所以我真的很困惑。

如果有人可以請示例查詢,使用連接和全文並使用關係表,或者向我解釋哪些連接要使用(如果有)以及針對全文提供的任何提示,我將不勝感激在我擁有的數據庫結構上。

下面是我的基本數據庫架構:

 
photos (tbl) 
photoID    INT(11)   Primary  Auto-Increment 
headline   Long-Text 
caption    Long-Text 
dateCreated   DateTime 

people (tbl) 
peopleID   INT(11)   Primary  Auto-Increment 
people    VarChar(255) 

photoPeople (tbl) 
photoID    INT(11) 
peopleID   INT(11) 

keywords (tbl) 
keywordID   INT(11)   Primary  Auto-Increment 
keyword    VarChar(255) 

photoKeyword (tbl) 
photoID    INT(11) 
keywordID   INT(11) 

photoContributor (tbl) 
photoID    INT(11) 
contributorRef  VarChar(100) 

當進行檢索,被查詢的表/字段: photos.headline,photos.caption,keywords.keyword,people.people, photoContributor.contributorRef。

我希望有人能幫助我建立這個緊急查詢。

+0

全文索引只能在MyISAM表上使用。 InnoDB支持他們從未(以及事情發展的方式,可能永遠不會)。 –

+0

我的表正在使用MyISAM引擎,這是否有助於我的原因..? – TheCarver

回答

2

同時擁有全文搜索和外鍵約束(這對於連接很有用)對於MySQL來說是個麻煩,因爲它們只被MyISAM和InnoDB引擎分別支持。

爲了進行全文搜索,您必須將表格添加到MyIsam引擎。我沒有那麼多的經驗,所以我不能幫你很多。

您猜對的時間接收器是您使用帶%前綴的數據,迫使數據庫在返回之前查看錶中每個該死的條目。

如果您想要使用連接,您必須在輪詢數據庫之前拆分查詢字符串,但這應該相當容易。 在W3school教程中可以找到關於連接的很好介紹。 http://www.w3schools.com/sql/default.asp

主要的問題我可以看到你運行到是這樣的: 即使你設法讓一些體面的聯接在你的數據庫來實現,你仍然需要在連接表一樣使用(因爲你不能做滿在InnoDB上進行文本搜索)。正因爲如此,花哨的加入不會加快你的查詢速度。

我的建議是: 使更多的搜索字段。這樣做會使得從聯接中獲得好的東西成爲可能。 將人名分解爲First,Middle Name,避免需要使用Like。

如果您確實想保留一個文本框搜索,那麼您可能需要制定一些關於如何輸入數據的約定(以便您可以在幕後進行分割並搜索),就像您使用前綴貢獻者一樣。

對不起,我不能更精確,更有幫助,但是你提出的並不是一個快速修復的問題,我害怕。

+0

感謝您的快速響應。我同意這是問題需要時間才能完成。 – TheCarver

+0

我剛剛檢查過,我的表格正在使用MyISAM引擎。我已經有了一個高級搜索頁面,用戶可以使用多個文本框,但似乎每個人都使用快速搜索框,因此需要一個新的查詢。 – TheCarver

+0

此外,它只是我的標題和標題字段使用「LIKE」。關鍵字,人物和貢獻者字段必須完全匹配,例如WHERE keyword ='太陽眼鏡' – TheCarver