我如何优化这个搜索结构?
Posted
技术标签:
【中文标题】我如何优化这个搜索结构?【英文标题】:How do i optimize this search structure? 【发布时间】:2012-10-14 21:16:27 【问题描述】:我正在开发一个网络应用程序,让用户可以在数据库中搜索项目。这些项目分为几个类别。返回的每个搜索项根据其字段值以不同方式显示。目前我建立了一个类来处理显示和另一个来处理搜索。搜索类使用多个用户输入构建 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 过滤与搜索条件不匹配的少数剩余结果会更好吗?
【问题讨论】:
【参考方案1】:在我看来,每一步都需要对结果进行过滤,否则,随着数据越来越大,查询会变慢。因此上一段提到的策略是最优的。
【讨论】:
这不会减慢 PHP 本身的速度并影响页面的整体解析时间,甚至比 mysql 所做的更糟吗? MYSQL 具有非常好的数据处理能力,并且可能能够比 PHP 更好地处理数据。我需要对此有更深入的了解。【参考方案2】:您应始终尽量避免将查询置于循环中。单个查询,即使它很复杂,通常也更快并且可以更好地扩展。像所有“规则”一样,也有例外。如果循环比复杂查询快得多,那么您应该坚持使用循环,因为您知道它不会增长到进行数十或数百次迭代(对吗?)。
就在 DB 或 PHP 中进行过滤而言,通常最好在 DB 中进行,并避免通过网络传输无用数据。在 MySQL 中使用 HAVING 选项通常等同于在 PHP 中进行过滤。
【讨论】:
循环将是每个请求大约 25 次迭代,更糟糕的是 100 次迭代。 我个人不会将查询保持在循环中。无论查询多么简单,任何数据库都具有每秒可以处理的最大查询数。 3 个同时请求可能意味着您试图达到的每秒 300 个请求。这不会扩展。 非常感谢,在我的托管服务器开始抱怨之前,我可能不会担心每秒最大查询数...... 他们可能会抱怨由许多查询引起的 CPU 峰值。去过那里,做到了。【参考方案3】:您需要牢记延迟。通常对于运行缓慢的联网应用,延迟是罪魁祸首。
即使每个单独的查询都很小并且可以快速执行,它们都有延迟。你说最坏的情况,100 个查询。
即使每个查询只有 10 毫秒的延迟(请记住,每个查询都需要网络驱动程序的开销、线路上的实际往返时间等),您也无需添加 100*10ms = 1 秒(难以置信的长用计算机术语)。
很可能只需不到一秒的时间就可以简单地执行 1 个查询,一次获取所有信息。那么您只会招致一次延迟损失。
所以我建议重写你的方法以使用一个查询,并按照你的建议传递数组。
这样的事情总是会通过测试,因为人们在客户端和服务器之间的延迟非常低的环境中进行测试(例如在没有太多活动的同一台服务器上)。然后应用程序进入现实世界,客户端和服务器都很忙并且相距数百英里......
【讨论】:
以上是关于我如何优化这个搜索结构?的主要内容,如果未能解决你的问题,请参考以下文章