通过执行分页来减少连接表,按顺序排序?

时间:2014-09-03 02:19:52

标签: php mysql database-performance

对不起,这可能是一个菜鸟问题,但我不知道如何搜索这个问题。

用户案例
全站点搜索功能:当用户输入关键词并提交表格时,系统应该同时搜索标题&论坛,博客,产品的内容。所有这些类型页面的搜索结果应显示在一个带分页的列表中。用户还可以选择按相关性或新近度排序结果。

我做了什么
我正在使用LMAP。我有这三种页面类型的数据表,我已经制作了标题&内容列作为索引键。
我知道连接表是一个非常糟糕的主意,所以我为搜索论坛,博客和产品做了三个单独的查询。我将所有数据导入PHP,将它们转换为数组,编写一个函数,为搜索结果的每一行创建相关值。对于新近度,所有这些表中都有“updateDate”列,所以没关系 现在我有三个不错的阵列。我可以内爆()它们并轻松地排序()它们。我也可以通过array_slice()来渲染分页。

是什么让我皱眉
 不必要的性能浪费。是的,我所做的是能够在用户案例中完成所有事情,但是---我不知道该怎么做(我是初学者),---但我确信性能会好很多。

  1. 在第一次查询之后,我们需要的所有数据都已从数据库中获取。但是使用我的解决方案,每当用户点击搜索结果的另一页,或者更改“排序依据”时,php将重新开始,并再次执行[sql query,relevant function,implode()]。我可以将结果数组存储在someWhere中,这样系统可以为下一次用户操作节省一些能量吗?
  2. 大多数用户不会点击搜索结果的所有页面。我猜测90%的用户不会继续关注第10页,这意味着(可能是)记录的前200个。那么,我可以做任何事情来阻止sql查询而不是所有结果吗?
  3. 此外,当流量增长时,可能会有一些关键词变得普遍并且重复搜索大量时间,我能做些什么来减少这些搜索的重复? (如果你觉得我在思考太多,请打我)
  4. 感谢您阅读这些内容,如果我的概念不正确,请纠正我,或者告诉我在这个用户案例中是否遗漏了一些注意事项。谢谢,愿上帝的爱与你同在。

    编辑:我没有使用任何php框架。

1 个答案:

答案 0 :(得分:0)

为了得到完整的故事,可能就像写一本书一样。以下是一些提取的想法:

  • 完全成熟的页面指示器会花费您额外的数据集计数 - 只是存在"下一步"按钮可以通过选择...限制[nr_of_items_per_page + 1],然后if(isset($ result [nr_of_items_per_page + 1]))输出下一个按钮
  • 这些天净流量成本并不像十年前那么高,用户需求更多。将nr_of_items_per_page增加到100,200,500(取决于每条记录的数据大小)
  • Zitty Yams评论工作 - 我已经一次性加载了> 10000条记录给客户并逐件呈现 - 它只是摇滚 - 例如。包含10个字符平均值的10000个名称列表只能生成100000个字节。你在网上获得的大多数图像都比那些大。因为有限制......
  • 通过$ SESSION进行php缓存也很有效 - 但请记住,为php保留的每个字节都不能专用于数据库(至少不能用于共享服务器)。只要并非数据库中的所有数据都适合内存,在大多数情况下,扩展数据库内存比增加php缓存或操作系统缓存更有效。