0

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

执行此操作的代码摘录:

//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);

显示类一个接一个地查询数据库以获取每个项目的完整详细信息,并将其显示为应显示的内容。

我的问题是在第一次查询数据库并将数据存储在数组中然后将该数组传递给显示类而不是让显示类使用项目的唯一 ID 查询每个项目的数据库?我目前的解决方案目前运行良好,但我需要知道当数据库开始增长(大约 500,000 行)时我的方法是否会出现问题。

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

4

3 回答 3

1

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

于 2012-10-14T21:27:16.250 回答
1

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

至于在数据库或 PHP 中进行过滤,通常最好在数据库中进行,并避免通过网络传输无用的数据。在 MySQL 中使用 HAVING 选项通常等同于在 PHP 中进行过滤。

于 2012-10-14T21:28:59.957 回答
1

您需要牢记延迟。通常对于运行缓慢的联网应用程序,延迟是罪魁祸首。

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

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

很可能只需不到一秒的时间就可以简单地执行 1 个查询,一次获取所有信息。然后你只会招致一次延迟惩罚。

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

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

于 2012-10-22T16:45:25.430 回答