我有一个循环遍历满足某个条件的表的所有行的方法,然后检查该行中的一个列是否出现在文本中.方法如下:
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%的行与类型列匹配,然后对所有数据的顺序读取(即不使用索引)将比使用索引识别行然后随机访问读取它们更快.但是数据库会知道是否是这种情况,创建索引并没有什么坏处,那么数据库可以根据这个标准使用它.
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。