2014-09-23 50 views
0

我有一個複雜的查詢,並根據搜索關鍵字從數據庫中提取數據。我寫了兩個查詢來通過連接兩個表來獲取基於關鍵字的數據。每個表格包含超過5百萬條記錄。但問題是,這個查詢需要5-7秒的時間才能運行,因此頁面需要更多時間才能運行。查詢如下:我如何使查詢更快

SELECT DISTINCT(`general_info`.`company_name`), 
       general_info.* 
FROM general_info 
     INNER JOIN `financial_info` 
       ON `financial_info`.`reg_code` = `general_info`.`reg_code` 
WHERE (`financial_info`.`type_of_activity` LIKE '%siveco%' 
      OR `general_info`.`company_name` LIKE '%siveco%' 
      OR `general_info`.`reg_code` LIKE '%siveco%') 
+0

任何時候當你試圖做'LIKE'%word%''時,你將會有多餘的性能 – Kermit 2014-09-23 15:35:48

+0

其他想法:[MySQL全文搜索功能](http://dev.mysql.com/doc/refman/5.0/ en/fulltext-search.html)或NoSQL與MapReduce。 – DanFromGermany 2014-09-23 15:41:56

回答

1

括號周圍的括號沒有區別。 distinct不是一個函數。所以,你的查詢等效於:

SELECT gi.* 
FROM general_info gi INNER JOIN 
     `financial_info` gi 
     ON fi.`reg_code` = gi.`reg_code` 
WHERE fi.`type_of_activity` LIKE '%siveco%' OR 
     gi.`company_name` LIKE '%siveco%' OR 
     gi.`reg_code` LIKE '%siveco%'; 

對於join,你應該有general_info(reg_code)financial_info(reg_code)指標。你可能已經有了這些索引。

真正的問題可能是where子句。由於您在模式的開頭使用通配符,因此無法使用常規索引對其進行優化。您可以使用全文搜索以及matches條款來做你想做的事。這種索引的文檔是here。如果你正在尋找各種名字的完整單詞,這將特別有效。

+0

+1。 'DISTINCT'是一個適用於整個SELECT列表的關鍵字;在parens中包裝表達沒有任何區別。如果'financial_info'中的多行與general_info中的給定行匹配(即,如果'reg_code'在'financial_info'中不唯一,則DISTINCT將產生效果(返回的行數)。 – spencer7593 2014-09-23 15:50:07