3

我正在编写一个 php-mysql 应用程序。该应用程序允许用户对数据库运行搜索。运行搜索时,如果用户在检查了它提出的项目后单击后退按钮返回到它,他们会被询问是否要重新发送查询(它使用 post)。这将在数​​据库中重新运行搜索。使用 get 不会导致请求重新发布 - 但它仍会再次运行搜索。

有没有办法存储搜索并调用它,而无需在数据库中重新运行它?

这可以将其保存在数据库中,或者以某种方式保存在 php 中——也许是会话?这些搜索可能会产生很多数据,我觉得对于会话来说可能太多了。

我能想象的另一种方法是将它存储在数据库中,在某种临时表中。使用我打算查询的列创建表,然后选择插入。然后从表中选择 *。这似乎也是一个坏主意。许多动态创建的临时表四处飘荡。

我知道这是可以做到的。保存的搜索是您在许多 Web 应用程序中看到的内容。那么一般是怎么做的呢?

4

2 回答 2

2

内存缓存

或者

装甲运兵车

但是,我注意到您没有说明为什么要缓存搜索结果。“因为它更快,而且我读到它使我的应用程序更具可扩展性,”这是通常的原因。这闻起来像是过早的优化。

我建议您构建您的应用程序并对其进行分析。这些“搜索”的成本有多大?为什么它们很昂贵?它是糟糕的架构设计吗?是不是索引不好?存储引擎选择不当?

你确实意识到 MySQL 有一个查询缓存,对吧?在许多情况下,这可能就是您所需要的。尝试使用 mysql 客户端运行一个昂贵的“搜索”查询并记下时间,然后再次运行它。看?

于 2010-01-24T04:40:52.303 回答
1

要修复“您要重新提交”错误,您可以将请求存储在会话或数据库中,然后立即重定向到新页面以实际执行搜索:

search.php?searchId=22

if (isset($_GET['searchId'])) {
  $search = $_SESSION['search'][$_GET['searchId'];
  // do search
} elseif (isset($_POST['search'])) {
  $_SESSION['search'][] = $_POST;
  header('Location: search.php?searchId=' . (count($_SESSION['search']) - 1);
}

然后可以从 $_SESSION['search'][22] 或数据库中获取查询字段...

至于保存结果,您可以依靠浏览器的缓存,或者您可以将单个 SERP 存储在会话或数据库中......如果需要,可以在某个时候过期旧的......

创建结果表很好(并且会加快复杂搜索的分页速度),但您可能会有数百万次点击,因此使用缓存进行分页将是更通用的方式。

如果用户想在几天或几周后返回搜索,您可以使用保存的查询字段重新运行搜索。

于 2010-01-24T04:41:19.933 回答