mysql查询长记录,需要足够长的时间来显示记录

时间:2013-10-11 18:07:49

标签: php mysql

我有一个包含大约500000条记录的表,我想要做的就是使用限制使用LIKE通配符进行选择查询,无论我做什么,它都需要足够长的时间才能显示结果。这对我来说没什么价值,怎么能让它运行得更好?我的查询在下面

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%'

2 个答案:

答案 0 :(得分:0)

谈论一个疯狂的过于复杂的查询。为什么你要运行工会呢?您添加到联合的每个查询都作为其独立于OWN的查询运行,然后将所有结果组合在一起以形成最终结果集。很痛苦。为什么不

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

仍然非常难看,但至少它只是一个单一查询。当然,和往常一样,我们应该指出你很容易受到SQL injection attacks的攻击,使用已弃用的mysql接口,等等等等......

答案 1 :(得分:0)

索引productname列。为关键字设置单独的列并不是一个坏主意,因此每当包含关键字的较小列包含任何关键字时,数据库服务器就不必在较长的文本中搜索它们。