Php 如何优化此搜索结构?

Php 如何优化此搜索结构?,php,mysql,sql,database,query-optimization,Php,Mysql,Sql,Database,Query Optimization,我正在开发一个web应用程序,允许用户在数据库中搜索项目。这些项目分为几个类别。返回的每个搜索项根据其字段值的不同显示不同。目前,我构建了一个类来处理显示,另一个类来处理搜索。search类使用多个用户输入构建SQL查询,查询数据库中与用户输入匹配的项的ID,并将数组中的ID发送到display类 执行此操作的代码摘录: //the sql query is actually a little more complex than this $query = "SELECT items.id FR

我正在开发一个web应用程序,允许用户在数据库中搜索项目。这些项目分为几个类别。返回的每个搜索项根据其字段值的不同显示不同。目前,我构建了一个类来处理显示,另一个类来处理搜索。search类使用多个用户输入构建SQL查询,查询数据库中与用户输入匹配的项的ID,并将数组中的ID发送到display类

执行此操作的代码摘录:

//the sql query is actually a little more complex than this
$query = "SELECT items.id FROM items, subcategories WHERE {$name} AND items.`base_school` = '{$_SESSION['base_school']}' AND items.subcategory = subcategories.id AND subcategories.parent_category = {$search_category} ORDER BY `time_added` DESC {$limit}";
$result = $DB_CONNECTION->query($query);
$newly_added = array();
while  (list($id) = $result->fetch_row()) $result[] = $id;
searchDisplay::print_result($result);
display类逐个查询数据库中每个项目的完整详细信息,并按应显示的方式显示

我的问题是,查询数据库以获取项目的完整详细信息(来自3个不同表的大约23个字段)是否更好/更快第一次查询数据库并将数据存储在数组中,然后将该数组传递给display类,而不是让display类使用items unique ID查询数据库中的每个项目?我当前的解决方案目前运行良好,但我需要知道,当数据库开始增长(大约500000行)时,我的方法是否会出现问题


其次,使用用户提供的几个搜索条件过滤数据库中的数据。构建一个包含几个连接的复杂查询,以适应所有用户的条件,还是编写一个包含主要过滤器的简单查询,然后使用PHP过滤与搜索条件不匹配的少数剩余结果

在我看来,每个步骤都需要对结果进行过滤,否则随着数据越来越大,查询会变得越来越慢。因此,上一段中提到的策略是最佳策略。

在我看来,在每一步都需要对结果进行过滤,否则随着数据越来越大,查询会变得越来越慢。因此,上一段提到的策略是最佳策略。

您应该始终避免将查询放入循环中。单个查询,即使很复杂,通常也会更快,扩展性更好。与所有“规则”一样,也有例外。如果循环比复杂查询快得多,那么您应该坚持使用循环,因为您知道它不会增长到进行几十次或数百次迭代(对吧?)


至于在DB或PHP中进行过滤,通常最好在DB中进行过滤,避免通过网络传输无用数据。在MySQL中使用HAVING选项通常相当于在PHP中进行过滤。

您应该始终避免将查询放入循环中。单个查询,即使很复杂,通常也会更快,扩展性更好。与所有“规则”一样,也有例外。如果循环比复杂查询快得多,那么您应该坚持使用循环,因为您知道它不会增长到进行几十次或数百次迭代(对吧?)


至于在DB或PHP中进行过滤,通常最好在DB中进行过滤,避免通过网络传输无用数据。在MySQL中使用have选项通常相当于在PHP中进行过滤。

您需要记住延迟。对于运行缓慢的网络应用程序,延迟往往是罪魁祸首

即使每个查询都很小并且可以快速执行,它们都有延迟。你说最坏的情况是100个查询

即使每个查询只有10毫秒的延迟(请记住,每个查询都需要网络驱动程序的开销、线路上的实际往返时间等),您也不需要添加100*10ms=1秒(用计算机术语来说,非常长)

很可能只需不到一秒钟的时间,就可以执行一个查询,一次获取所有信息。那么您只会遭受一次延迟惩罚

所以我建议重写您的方法,使用一个查询,并按照您的建议传递数组


像这样的事情总是会在测试中漏掉,因为人们在客户机和服务器之间的延迟非常低的环境中进行测试(例如,在同一台服务器上,没有太多活动)。然后应用程序进入现实世界,客户端和服务器都很忙,相隔数百英里……

您需要记住延迟。对于运行缓慢的网络应用程序,延迟往往是罪魁祸首

即使每个查询都很小并且可以快速执行,它们都有延迟。你说最坏的情况是100个查询

即使每个查询只有10毫秒的延迟(请记住,每个查询都需要网络驱动程序的开销、线路上的实际往返时间等),您也不需要添加100*10ms=1秒(用计算机术语来说,非常长)

很可能只需不到一秒钟的时间,就可以执行一个查询,一次获取所有信息。那么您只会遭受一次延迟惩罚

所以我建议重写您的方法,使用一个查询,并按照您的建议传递数组


像这样的事情总是会在测试中漏掉,因为人们在客户机和服务器之间的延迟非常低的环境中进行测试(例如,在同一台服务器上,没有太多活动)。然后应用程序进入现实世界,客户端和服务器都很忙,相隔数百英里……

这会不会降低PHP本身的速度,影响页面的整体解析时间,甚至比MYSQL更糟糕?MYSQL具有非常好的数据处理能力,可能比PHP更好地处理数据。我需要对这一点有更深入的了解。这会不会降低PHP本身的速度,并对页面的整体解析时间产生比MYSQL更糟糕的影响?MYSQL具有非常好的数据处理能力,可能比PHP更好地处理数据。我需要更深入地了解这一点。循环将是每个请求大约25次迭代,更糟糕的是100次迭代。我个人不会将查询保持在循环中。任何数据库都有一个