0

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

询问

 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);

任何帮助表示赞赏,谢谢

注意 我已将此查询分解为联合,因为它用于搜索目的,我想从用空格分隔的字符串的所有可能匹配项中进行查询搜索,即 A TEST QUERY。应视为“%A%”、“%TEST%”、“%QUERY%”

4

2 回答 2

0

谈论一个极其复杂的查询。为什么你必须运行所有工会?您添加到联合中的每个查询都作为其 OWN 独立查询运行,然后将所有结果组合起来形成最终结果集。很痛苦。为什么不

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

仍然非常难看,但至少它只是一个 SINGLE 查询。当然,和往常一样,我们应该指出你很容易受到SQL 注入攻击,使用不推荐使用的 mysql 接口,等等等等。

于 2013-10-11T18:12:08.237 回答
0

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

于 2013-10-11T18:21:33.983 回答