我有一个包含大约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%'
答案 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列。为关键字设置单独的列并不是一个坏主意,因此每当包含关键字的较小列包含任何关键字时,数据库服务器就不必在较长的文本中搜索它们。