加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

PHP:帮助执行一系列查询

发布时间:2020-12-13 21:38:58 所属栏目:PHP教程 来源:网络整理
导读:我有一个循环遍历满足某个条件的表的所有行的方法,然后检查该行中的一个列是否出现在文本中.方法如下: public function isRecipeType($ingredients,$type){ $rows = $this-fetchAll($this-select()-where("type = ?",$type)); foreach($rows as $row) { if(
我有一个循环遍历满足某个条件的表的所有行的方法,然后检查该行中的一个列是否出现在文本中.方法如下:

public function isRecipeType($ingredients,$type)
{
    $rows = $this->fetchAll($this->select()->where("type = ?",$type));

    foreach($rows as $row)
    {
        if((strpos($ingredients,$row->name)) !== false)
        {
            return true;
        }
    }
}

但这需要永远.如何加快速度(不从表中删除行)?

解决方法

您尝试解决的问题可以表示为“是否存在任何行,类型= X,其名称包含文本Y?”

这是数据库可以回答的问题,无需在PHP中编写循环.使用数据库更快,数据库可以访问有关调优的更多信息.基本上将匹配该类型的表的整个子集从数据库(可能通过网络)下载到PHP处理器以回答查询是低效的.让DB为您完成工作.它也更容易阅读,因为SQL是一种声明性语言,而不是PHP解决方案必不可少.

public function isRecipeType($ingredients,$type)
{
    $sql = "SELECT COUNT(*) AS c ".
           "FROM table ".
           "WHERE type = ? ".
           "   AND ? LIKE CONCAT('%',name,'%')";
    $rows = execute($sql,$type,$ingredients);
    $row = $rows[0];
    return $row["c"] > 0;
}

这使用MySQL语法,如果您使用另一个数据库,则替换SQL的最后一行

"   AND ? LIKE '%' || name || '%'";

我在你的代码中发明了一个执行方法,我不知道你正在使用什么数据库访问层,但毫无疑问你可以访问类似的东西.

正如另一个答案所说,请确保您在类型列上有索引.然后,此语句的执行计划将是:查找具有匹配类型的所有行(使用索引),然后浏览数据并应用LIKE.

除非超过例如10%的行与类型列匹配,然后对所有数据的顺序读取(即不使用索引)将比使用索引识别行然后随机访问读取它们更快.但是数据库会知道是否是这种情况,创建索引并没有什么坏处,那么数据库可以根据这个标准使用它.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读