【问题标题】:Reduce join table with performing pagination, order by?通过执行分页减少连接表,按顺序排列?
【发布时间】:2014-10-27 10:01:16
【问题描述】:

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

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

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

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

  1. 在第一次查询后,我们需要的所有数据都已经从数据库中获取了。但在我的解决方案中,每当用户点击搜索结果的另一页,或更改“排序依据”时,php 将重新开始,并再次执行 [sql 查询,相关函数,implode()]。我可以将结果数组存储在 someWhere 中,以便系统可以为下一次用户操作节省一些能量吗?
  2. 大部分用户不会点击搜索结果的所有页面。我猜 90% 的用户不会继续关注第 10 页,这意味着(可能是)记录的前 200 页。那么,我可以做任何事情来停止某处的 sql 查询而不是所有结果吗?
  3. 此外,随着流量的增长,可能会有一些关键字变得很常见并且重复搜索很多时间,我该怎么做才能减少这些搜索的重复? (如果你认为我想太多,请打我)

感谢您阅读这些内容,如果我的概念不正确,请纠正我,或者如果我错过了此用户案例中需要注意的内容,请告诉我。谢谢你,愿上帝的爱与你同在。

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

【问题讨论】:

  • 搜索“缓存”。但是,直到有 大量的访问者(以至于它太慢),不要担心它。此外,“连接表是一个非常糟糕的主意”不是正确的普遍信念; 从适当的规范化开始和加入表比担心一些未知的性能问题要好得多。不损害模型的直接收益可以简单地通过使用正确的索引使用 MySQL 的全文来完成,尽管还有其他选项,例如 lucene
  • @user2864740 对不起,你能慢一点吗?我想知道“从适当的规范化开始”是针对普通情况的,而不是针对这种情况的?因为但是那些页面类型之间没有关系,它们就像模块,而不是列中的争用......(除了 createUser 和 updateUser)。所以我认为不会建议在选择时加入他们,对吧?
  • 您正在将整个搜索结果拉入浏览器,但 javascript 只显示一小部分行,并且第 2 页上发生了相同的过程?您应该查看 SQL 分页。
  • 哦,我当时认为“将整个搜索结果拉入浏览器”不是一个好主意。因为它给客户端带来了太多的流量,使得用户体验不友好。如果我错了,请纠正我。
  • push.push.push.push.push.push.push.

标签: php mysql database-performance


【解决方案1】:

让您了解完整的故事可能就像写一本书一样。以下是一些提取的想法:

  • 完整的页面指示器会花费您额外的数据集计数 - 只需显示“下一步”按钮,可以通过 select ... limit [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 cmets 解决了问题 - 我一次性加载了超过 10000 条记录给客户,并逐个展示了这些记录 - 它只是摇滚 - 例如。包含 10 个字符的 10000 个名称的列表平均只有 100000 个字节。您在网上获得的大多数图像都比这大。当然有限制...
  • 通过 $SESSION 的 php 缓存也可以工作 - 但是请记住,为 php 保留的每个字节不能专用于数据库(至少不能在共享服务器上)。只要不是数据库中的所有数据都适合内存,在大多数情况下扩展数据库内存比增加 php 缓存或 os 缓存更有效。

【讨论】:

    猜你喜欢
    • 2013-11-12
    • 1970-01-01
    • 2019-11-18
    • 2023-04-04
    • 1970-01-01
    • 1970-01-01
    • 2017-05-04
    • 2021-12-01
    • 1970-01-01
    相关资源
    最近更新 更多