2010-08-19 221 views
0

我正在修改我前幾天的問題。重寫了我的查詢。重訪MySQL多重匹配查詢....需要這麼長時間

有人能告訴我爲什麼在多個表上運行任何類型的查詢需要很長時間使用我將在下面發佈的查詢?

有沒有人有時間來幫我解決這個問題?我可以支付200美元我認爲這對於兩個小時的工作是很好的。我會在這裏回覆這個答案,這會讓每個人都受益。

查詢基本上是這樣的:

SELECT bb_business.business_name, bb_business.id AS bid FROM bb_business 
LEFT JOIN bb_offers  ON bb_business.id = bb_offers.store_id 
LEFT JOIN bb_cat_business ON bb_business.id = bb_cat_business.store_id 
LEFT JOIN bb_categories ON bb_categories.id = bb_cat_business.cat_id 
WHERE bb_business.active = '1' 
    AND MATCH(bb_business.business_name) AGAINST ('zebra') 
    OR MATCH(bb_categories.category_name) AGAINST ('zebra') 
    OR MATCH (bb_business.city,bb_business.state,bb_business.zip) AGAINST ('zebra') 
GROUP BY bb_business.business_name 
ORDER BY bb_business.business_name DESC 
LIMIT 1,10 

即查詢需要50秒執行第一時間。第二次如預期的那樣快速。

如果我改變該查詢只使用一個匹配,它是快速的。只要我添加第二個MATCH或LIKE語句,它就會重新執行40-60次執行時間。

運行,準確的查詢執行時間爲:MySQL returned an empty result set (i.e. zero rows). (Query took 47.7614 sec)

解釋返回此:

1 SIMPLE bb_business ALL NULL NULL NULL NULL 2877 Using temporary; Using filesort 
1 SIMPLE bb_offers ALL NULL NULL NULL NULL 94 
1 SIMPLE bb_cat_business ALL NULL NULL NULL NULL 5697 
1 SIMPLE bb_categories eq_ref PRIMARY PRIMARY 8 buxback_site.bb_cat_business.cat_id 1 Using where 

當僅使用一個比賽,該查詢使用全文索引我有bb_business。當我有多個匹配時,它似乎沒有使用任何索引。

這裏有指標上bb_business:

PRIMARY PRIMARY 2877  id 
store_id UNIQUE 2877  store_id 
index_business_name INDEX 2877  business_name 
business_name FULLTEXT 1  business_name 
city FULLTEXT 1  city 
state 
zip 

這裏是bb_categories指標:

PRIMARY PRIMARY 15  id 
category_name UNIQUE None  category_name 
category_name_2 FULLTEXT None  category_name 

我絕望!

謝謝!

+0

如果你想聯繫我直接發送到senica在allebrum.com – 2010-08-19 14:20:36

回答

1

問題是你迫使MySQL創建臨時表來解決查詢。只要你做了多個比賽,這幾乎是一個問題。

如果您的用例確實需要您這樣做,那麼您有兩個主要選項(我可以看到)。

  1. 創建一個非歸一化的彙總表,您可以在需要匹配的所有列上放置全文索引。然後,通過觸發器,存儲過程或在代碼中執行查詢時保持此表的更新(然後執行與該彙總表的所有匹配)(它應該不需要在一個表中包含多個MATCH子句)查詢)...
  2. 另一種選擇是使用專用搜索引擎,如Apache SOLRSphinx。你需要單獨搜索,然後將結果從數據庫中提取出來,但是這些搜索引擎比MySQL強大得多(雖然功能不強大,但是執行復雜查詢更容易),並且比MySQL更快地執行這些查詢。他們可以這樣做,因爲他們預先索引everyting(他們犧牲磁盤空間 - 有時它很多 - 速度)...
+0

我結束了添加一個彙總表。工作得很好,我的執行時間足夠快。感謝您的建議並確認我所看到的內容。 – 2010-08-19 20:20:49

+0

你可以發佈關於彙總表的鏈接嗎?我想我需要這樣做,但我在谷歌上找不到任何東西 – NaturalBornCamper 2012-09-24 15:57:15