2013-10-11 89 views
0

我和周圍50萬記錄的表,所有我想要做的就是地方使用限制LIKE通配符選擇查詢,不管我做什麼,它需要足夠長的時間顯示結果。這對我來說毫無價值,我怎麼能讓它運行得更好?我的查詢低於MySQL查詢長時間的記錄,以足夠長的時間,以顯示記錄

QUERY

if (isset($_GET['res'])) { 
    $value = $_GET['res']; 
    $val = explode(" ", $value); 
     $query = "SELECT productid, productname, retailprice, lmnr, suplier 
       FROM comp where productname = '$value' "; 
     $count = count($val); 
     for ($i = 0; $i < $count; $i++) { 
      $query .= " union Select productid, productname, retailprice, lmnr, suplier 
       from comp where productname like '%" . $val[$i] . "%' "; 
     } 
      $query .=" GROUP BY productid, productname, retailprice, lmnr, suplier LIMIT $start, $limit"; 
} 
$result_query = $db->query($query); 

任何幫助表示讚賞,感謝

注意 我要打破這種查詢到工會,因爲它是用於搜索目的,我想要使用SPACES分隔的字符串的所有可能匹配進行查詢搜索,例如A TEST QUERY。應視爲'%A%','%TEST%','%QUERY%'

+0

[mysql-indexes](http://dev.mysql.com/doc/refman/5.0/en/mysql-indexes.html) – vbrmnd

+0

你有產品名稱的索引嗎? –

+0

使用union/group by with LIKE%..%with 500000的記錄,這將導致使用deepscans(讀取高起始值)的「Using temporary; Using filesort」,並且最類似地,這會生成基於MyISAM磁盤的臨時表(什麼需要通過quicksort algoritme分組在磁盤上,readom I/O讀取和寫入會緩慢),因爲大多數情況下結果不適合內存。EXPLAIN語句將解釋它所有... –

回答

0

談論一個瘋狂的過度複雜的查詢。爲什麼你必須全部管理工會?添加到聯合中的每個查詢都將作爲其OWN獨立查詢運行,然後將所有結果合併爲一個最終結果集。很痛苦。爲什麼不是

SELECT ... 
WHERE (productname IN ($val1, $val2, $val3, etc....)) 
    OR (productname LIKE '%$val[1]%') 
    OR (productname LIKE '%$val[2]%') 
    OR .... 
    etc... 

仍然非常難看,但至少它只是一個SINGLE查詢。當然,一如既往,我們應該指出,你很容易受到SQL injection attacks,使用不推薦的mysql接口,等等等等等等。

0

索引productname列。爲關鍵字設置一個單獨的列是一個不錯的主意,因此每當包含關鍵字的較小列包含任何關鍵字時,數據庫服務器就不必在較長的文本中搜索它們。