【问题标题】:Best way to speed up search result display加快搜索结果显示的最佳方法
【发布时间】:2013-03-17 08:57:15
【问题描述】:

我们一直在为一个具有大约 200 万个姓名和地址以及 300 万个相关订阅和会议出席记录的 mySQL 数据库设计一个搜索结果系统的原型。

在执行搜索并返回所有结果的那一刻,对于每个结果,我执行第二个查询以查找订阅/会议以获取此人的唯一 ID。我在所有重要列上都有索引,并且各个查询在 phpMyAdmin(0.0xxx 秒)中执行得非常快,但是将其输入网页以显示(PHP,使用 DataTables 分页)并且页面需要几秒钟才能呈现。我们已经尝试将数据移植到 Lucene 数据库,这就像 LIGHTNING,但瓶颈似乎仍然是显示结果而不是检索结果。

我猜这是由于在浏览器中构建、服务和呈现页面的开销。我想我可以通过执行 GROUP_CONCAT 来删除我上面提到的子查询以获取原始查询中的订阅代码,但是如何加快结果页面的显示速度?

我想的很少,经常使用 AJAX/服务器端分页查询可能是这里的方法(可能得到 50 个结果,查询更小,页面更小并且可以更快地提供服务)但我欢迎任何建议你们可能有。

【问题讨论】:

  • 能否提供包括索引在内的任何 sql 示例/EXPLAIN 的/架构信息?随着毫秒数很快加起来,第二个查询可能会限制您。
  • 你试过在没有“DataTables”的情况下渲染它
  • @Simonatmso.net - 这是一个按姓名搜索某人的示例查询:pastebin.com/DWscK2Y4 - 该订阅查找查询中的内容比需要的要多得多,因为在其他地方使用了相同的查询系统。可能只为搜索结果编写一个单独的较小版本。
  • @Rob 我有 - 似乎没有太大区别。我想页面仍在完整返回,我们只是没有 DataTables 然后为我们分页。
  • 在我的一些报告中,我遇到了完全相同的问题,这纯粹是由于网络浏览器处理了返回的 html 数量。如下所述,服务器端分页是解决方案,因此限制为每页返回 50 个左右的结果。缺点是它会导致数百页的大型数据集。我一直在做的替代方法是生成 HTML,但不渲染/输出到屏幕。相反,我一直将它写成 PDF,然后将 pdf 存储在文件系统上并使 PDF 可供用户使用。这具有很高的初始负载,但也允许我在未来回忆结果

标签: php mysql performance search lucene


【解决方案1】:

即使您使用 Datatables 进行分页,所有结果都会首先加载到页面源代码中,尽管您使用的是 server side feature.

一次加载 200 万行总是会缓慢渲染。您必须进行服务器端分页,可以通过 AJAX 或普通 PHP 脚本。

您还可以考虑使用缓存系统来加快从服务器加载数据的速度,并避免在不需要时调用数据库。如果您的数据可以随时间随机变化,您可以随时使用函数来检查自上次缓存数据以来数据是否发生了变化,如果是,则更新缓存的数据。

【讨论】:

  • 可能是搜索视图并随机同步该视图?我不是每次都返回所有 200 万行,但确实结果计数可以达到五位数......这是服务器一次呈现给浏览器的大量数据。我越想越明显,似乎越小的结果就是立竿见影的改善....
  • 以附近的任何大型网站为例。他们都没有一次加载这么多的数据。服务器端的分页和排序以及 AJAX 的自动完成搜索,如果没有,则通过 POST。
  • 是的。任何可以解决问题的缓存系统的建议?我已经思考过,偶尔刷新的 mySQL 视图(每隔几分钟添加一次新记录,更新频率较低 - 实时性并不重要)是否会更好 - 你的想法?
  • 不是服务器端问题,而是浏览器问题。
  • 您可以阅读一些网站中有关 PHP 缓存的信息,例如 thisthis。我只使用过 CakePHP 框架及其缓存,所以我对其他技术不是很熟悉。
猜你喜欢
  • 1970-01-01
  • 2013-03-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-12-25
  • 2012-05-30
  • 2010-10-24
  • 1970-01-01
相关资源
最近更新 更多