在Facebook上,当一个墙贴有很多评论时,你只会看到最后两条评论。然而,正好位于它们之上的是一个类似“查看所有15条评论”的链接。
在MySQL中,这需要两个查询吗?一个获得总评论数,另一个获取最后两个评论的内容?然后,单击“查看全部”链接需要第三个,以获取剩余评论的内容。
如果是这种情况,在单个MySQL查询中简单地获取所有注释的内容会不会更有效率?这将允许您使用PHP查找总数,如果您只是将所有注释的内容输出到页面,则不需要进行第三次查询,使用css隐藏您最初不想显示的那些和JavaScript在用户点击“查看全部”链接时显示它们。
我认为我错了。 Facebook开发人员肯定比我更好。但我正在开发一个具有类似要求的网站,我正在努力了解实现此类功能的最有效方法。
答案 0 :(得分:4)
在MySQL中,您可以使用有限选择来检索指定SQL_CALC_FOUND_ROWS
的最新评论,然后查询FOUND_ROWS()
查询以获取所有评论的计数。
即。先做:
select SQL_CALC_FOUND_ROWS title, description from comments order by post_date desc limit 2;
检索最近的2条评论,然后执行:
select FOUND_ROWS();
检索评论总数。
有关详细信息,请参阅FOUND_ROWS() documentation on mysql.com。
就性能而言,它应该比执行另一个COUNT(*)查询更快(根据文档:p)......
答案 1 :(得分:2)
他们可能知道,90%的所有页面浏览者都不会点击“查看全部”链接,因此通过这样做,他们可以节省额外的数据库流量,并节省额外的Web服务器以满足客户端的需求。 / p>
在Web服务器之间背靠背地执行两个数据库查询,数据库具有可忽略的开销。无需设置另一个连接或数据库服务器创建另一个线程来为连接提供服务。这对于优化而言并不成熟。减少检索的数据量是谨慎使用资源。
答案 2 :(得分:1)
最终,获得评论的最佳/最快方式是将它们存储在新闻发布表中,您几乎将“COUNT(*)”查询缓存到comments
列。
如果您需要,可以选择使用第二个查询加载注释,如果没有注释则可以完全跳过它。
您还可以选择LEFT JOIN查询,该查询将对子查询中的注释进行计数,如果需要则返回0,将其保留为1个查询而不是2个。