Php MySql“LIKE”查询执行缓慢

Php MySql“LIKE”查询执行缓慢,php,mysql,sql,select,indexing,Php,Mysql,Sql,Select,Indexing,我的本地服务器数据库中有两个表。其中一个表有10k行,其中包含关键字列。另一个表有850k行,其中包含字符串。我的任务是获取与关键字匹配的字符串 我的问题是花了太多时间。 有什么方法可以快速得到结果吗?你能试试我下面的sql查询吗 $res_count = 1000; $keyword_sql = "SELECT tbid,keywords FROM `tbl_keywords1` LIMIT 0,$res_count"; $keyword_result = mysqli_query($conn

我的本地服务器数据库中有两个表。其中一个表有10k行,其中包含关键字列。另一个表有850k行,其中包含字符串。我的任务是获取与关键字匹配的字符串

我的问题是花了太多时间。
有什么方法可以快速得到结果吗?

你能试试我下面的sql查询吗

$res_count = 1000;
$keyword_sql = "SELECT tbid,keywords FROM `tbl_keywords1` LIMIT 0,$res_count";
$keyword_result = mysqli_query($conn, $keyword_sql);

$likeOr = array();
while ($keyword_row = $keyword_result->fetch_assoc()) {
    $key_wrd        = $keyword_row['keywords'];    
    $likeOr[]       = "keywords LIKE '%".$key_wrd."%' ";
}


if(count($likeOr) > 0 ){

    $sql            = "SELECT country,state,city,COUNT(tbid) AS cnt FROM `tbl_keywords` 
                          WHERE ".implode("OR", $likeOr)."
                          GROUP BY country,state";    
    $result         = mysqli_query($conn, $sql);    

    while ($row = $result->fetch_assoc()) {
         $res[] = $row;
    }

}

您在一个循环内使用sql查询,因此如果外循环计数为1000,那么将执行1000个mysql查询,并将导致延迟,因为mysql查询需要花费大量时间。请尝试使用join或unionsI在单个sql查询中获取数据。我随意更改了主题以反映您的实际问题:Q:有没有快速获取结果的方法?A:是的。两件事:1.尝试将查询重构为一个select,而不是一个不同select的循环!2如果仍然太慢,那么改进WHERE子句,使其更具选择性。理想情况下,对一个或多个已编制索引的列进行选择。您有一个n+1查询,这就是为什么它很慢的原因,正如其他人所说,您可以将查询更改为一个完整的select,并且您真的需要一次输出1000个关键字吗?我敢肯定如果你在的话,那根本不适合屏幕mobile@Ajith我需要得到与关键字匹配的所有字符串,所以我使用1000个关键字。我不知道我如何才能尝试将您的查询重构为一个select而不是一个不同select的循环!。请帮助编写示例代码。@Nishanthan我现在添加了一个答案,请检查并让我知道Nope Bro。您的代码使用了OR。因此我无法获取所有数据。在我以前的查询中,一个关键字得到219条记录。但是在我们的新查询中,总共得到21条记录。如果我使用关键字biomedical.query进行搜索,将搜索整个表。并返回219个结果。我的任务是搜索像这样的10k关键字。您是否可以调试并从tbl_关键字(如“%biomedical%”按国家分组,状态)中将此选择国家、州、城市、COUNTtbid作为cnt查看?我的上述答案是避免sql查询循环的方法,但为了确定真正的问题,我需要获取数据库的真实数据。但如果您提供调试结果,我仍然可以提供帮助,但它是850K*1000,具有领先的通配符。
$res_count = 1000;
$keyword_sql = "SELECT tbid,keywords FROM `tbl_keywords1` LIMIT 0,$res_count";
$keyword_result = mysqli_query($conn, $keyword_sql);

$likeOr = array();
while ($keyword_row = $keyword_result->fetch_assoc()) {
    $key_wrd        = $keyword_row['keywords'];    
    $likeOr[]       = "keywords LIKE '%".$key_wrd."%' ";
}


if(count($likeOr) > 0 ){

    $sql            = "SELECT country,state,city,COUNT(tbid) AS cnt FROM `tbl_keywords` 
                          WHERE ".implode("OR", $likeOr)."
                          GROUP BY country,state";    
    $result         = mysqli_query($conn, $sql);    

    while ($row = $result->fetch_assoc()) {
         $res[] = $row;
    }

}