2013-10-11 44 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列。为关键字设置一个单独的列是一个不错的主意,因此每当包含关键字的较小列包含任何关键字时,数据库服务器就不必在较长的文本中搜索它们。