【发布时间】: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