我如何优化此搜索结构?

时间:2012-10-14 21:16:27

标签: php mysql sql database query-optimization

我正在开发一个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);

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

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

其次,使用用户提供的几个搜索条件过滤来自数据库的数据。使用一些能够满足所有用户标准的连接构建复杂查询,还是编写一个容纳主要过滤器的简单查询,然后使用PHP过滤少数与搜索条件不匹配的剩余结果,会不会更好?

3 个答案:

答案 0 :(得分:1)

在我看来,结果的过滤需要在每一步完成,否则随着数据变得越来越大,查询将变得缓慢。因此,最后一段提到的策略是最佳策略。

答案 1 :(得分:1)

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

就数据库或PHP中的过滤而言,通常最好在数据库中进行,并避免通过网络传输无用的数据。在MySQL中使用HAVING选项通常等同于在PHP中用来过滤事物的内容。

答案 2 :(得分:1)

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

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

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

很可能只需要执行1次查询就可以花费不到一秒钟的时间来获取所有信息。那么你只会产生一次延迟惩罚。

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

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