2010-08-17 67 views
0

我試圖運行MySQL查詢作爲網站上的搜索,它只是需要很長時間。MySQL查詢需要30秒執行......太長

我直接從phpMyAdmin運行它,大約需要20秒才能完成。

這裏是我運行查詢:

SELECT * , bb_business.id AS bid 
FROM bb_business 
LEFT OUTER JOIN bb_offers ON bb_business.id = bb_offers.store_id 
LEFT OUTER JOIN bb_cat_business ON bb_business.id = bb_cat_business.store_id 
LEFT OUTER JOIN bb_categories ON bb_categories.id = bb_cat_business.cat_id 
WHERE bb_business.active = '1' 
AND (
bb_business.business_name LIKE '%altas%' 
OR bb_categories.category_name LIKE '%altas%' 
OR bb_business.business_name LIKE '%juice%' 
OR bb_categories.category_name LIKE '%juice%' 
) 
AND (
bb_business.city LIKE '%%' 
OR bb_business.state LIKE '%%' 
OR bb_business.zip LIKE '%%' 
) 
GROUP BY bb_business.business_name 
ORDER BY bb_business.business_name DESC 
LIMIT 1 , 10` 

速度:顯示行0 - 0(1個總計,查詢花費20.1130秒)

我不知道要告訴你的最佳方式結構。但在這裏複製和粘貼一些表的排序規則:

bb_ach   128 InnoDB latin1_swedish_ci 32.0 KB - 
bb_business  2,862 InnoDB latin1_swedish_ci 1.6 MB - 
bb_categories  15 MyISAM utf8_general_ci 6.7 KB 60 Bytes 

bb_cat_business 2,926 MyISAM utf8_general_ci 49.6 KB 17 Bytes 

bb_emails   13 MyISAM utf8_general_ci 6.0 KB - 
bb_member   409 MyISAM utf8_general_ci 62.7 KB - 
bb_member_card 593 MyISAM utf8_general_ci 112.1 KB - 
bb_merchant  154 InnoDB latin1_swedish_ci 32.0 KB - 
bb_offers   80 InnoDB latin1_swedish_ci 16.0 KB - 
bb_products  2 InnoDB latin1_swedish_ci 32.0 KB 

如果我可以提供其他任何東西。請告訴我。

非常感謝您的幫助。

EDIT ##################################

沒關係,用OMG小馬建議,我改變了一些東西。做了一些東西MyISAM並創建了一些FULLTEXT索引來使用。

我結束了與此查詢:

SELECT *, bb_business.id AS bid FROM bb_business 
LEFT OUTER JOIN bb_offers ON bb_business.id = bb_offers.store_id 
LEFT OUTER JOIN bb_cat_business ON bb_business.id = bb_cat_business.store_id 
LEFT OUTER JOIN bb_categories ON bb_categories.id = bb_cat_business.cat_id 
WHERE bb_business.active = '1' AND 
MATCH(bb_business.business_name) AGAINST ('".addslashes($business)."') OR 
MATCH(bb_categories.category_name) AGAINST ('".addslashes($business)."') OR 
MATCH (bb_business.city,bb_business.state,bb_business.zip) AGAINST ('".addslashes($city)."') 
GROUP BY bb_business.business_name 
ORDER BY bb_business.imported,".$this->sortCol." ".$this->sortDirection." LIMIT ".$this->start.",".$this->limit 

我認爲它使人們更慢;)

的EXPLAIN給出了這樣的:

id select_type table type possible_keys key key_len ref rows Extra 
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 

所以結果是第一查詢最多需要40秒才能完成。如果我再次搜索完全相同的短語,速度與我期望MYSQL執行的速度相同。以毫秒爲單位。這只是第一次搜索需要FOREVER ...

還有什麼想法?我很樂意付錢給別人幫忙。

+0

你對這些表有什麼指標?以及EXPLAIN提供了什麼? – 2010-08-17 15:48:00

+2

您是否知道使用字段LIKE'%%'與field ='%'幾乎相同,因爲%%是您如何轉義百分號的方式。不知道這是否是你的意圖。 – Finster 2010-08-17 15:50:29

+1

@Finster - 它可能也強制bb_business的全表掃描...更好地從查詢中完全刪除任何這樣的條目...然後我們也有SELECT *而不是要檢索的列的列表,以及一個GROUP BY沒有任何彙總列 – 2010-08-17 15:56:04

回答

0

只是想回來修改這個併發布答案。我最終創建了一個索引表並創建了一個PHP腳本來索引主數據庫。底線是MySQL在處理多個表中的多個匹配方面做得不好。

2

以面值的查詢,這是我重新寫:

SELECT *, bb_business.id AS bid 
    FROM bb_business b 
LEFT JOIN bb_offers o ON o.store_id = b.id 
LEFT JOIN bb_cat_business cb ON cb.store_id = b.id 
LEFT JOIN bb_categories c ON c.id = cb.cat_id 
    WHERE b.active = '1' 
     AND ( bb_business.business_name LIKE '%altas%' 
      OR bb_business.business_name LIKE '%juice%' 
      OR MATCH(c.category_name) AGAINST ('altas', 'juice'))   
GROUP BY b.business_name 
ORDER BY b.business_name DESC 
    LIMIT 0, 10 
  • LIMIT從零開始 - 開始一個會忽略第一個記錄。
  • 您可以在MyISAM表上使用全文搜索(FTS)功能,這是MATCH() .. AGAINST的功能。您可以通過添加全文索引,使其更快...
  • SELECT *是個不錯的辦法 - 更好地拼出每一個你真正想要
+0

您還可以將business_name喜歡匹配 – 2010-08-17 19:00:45

+0

@ ovais.tariq:全文支持僅在MyISAM表上 - 「bb_business」是InnoDB – 2010-08-17 19:15:30

1

使用EXPLAIN來看看是怎麼回事,該數據庫是如何執行你的數據庫。

LIKE會導致性能下降,當參數以%開頭時,數據庫不能使用任何索引。