2012-06-07 26 views
0

任何人都可以告訴我這個MySQL查詢有什麼問題嗎?結合3個表和搜索MySQLoptimization

select distinct(a.productId) 
    from product a 
    left join product_keyword b 
    on b.productId = a.productId 
    left join keywords c 
    on c.keywordId = b.keywordId 
    where a.productName LIKE '%truck%' OR c.value LIKE '%truck%' 
    limit 100; 

其實我需要參加3個表(productproduct_keywordkeywords),並根據用戶輸入的搜索。一個產品可以是多個關鍵字,我將其存儲(keywordIdtable關鍵字product_keyword)。

任何人都可以幫助我嗎?

+1

語法很好,所以你需要提供*只是*更多的細節來解釋什麼是錯誤的..... – GDP

+0

我試圖運行,但我的SQL將掛起每次我嘗試它.. –

回答

1

當您在LIKE搜索的前綴中使用%通配符時,MySQL無法使用任何索引進行搜索。相反,MySQL必須掃描所有行。

您應該至少在連接列上有索引(productID和keywordID),以便MySQL能夠更快地執行連接操作。但是,如果結果集太大,MySQL也會執行JOIN掃描。

很可能,MySQL正在掃描產品中的每一行,然後對product_keyword執行JOIN,然後對關鍵字執行連接。然後,它會檢查它是否可以根據WHERE子句排除該行。一旦它返回100行,它就會停止。

0

如果你的表很大,這將是一個非常昂貴的查詢。在LIKE查詢上使用前導通配符通常會很慢。如果你需要這種搜索能力,最好在Lucene或類似的地方,而不是在數據庫中進行。