使用每个项目的总金额优化搜索。PHP与MYSQL
在stackoverflow上进行标签搜索这样的“运行总计”系统的最佳方法是什么?例如,如果我点击'php',它会显示'each'其他标记上的项目总数,而且速度非常快。如何在php中使用mysql实现这一点?我想他们只是在使用一个简单的使用每个项目的总金额优化搜索。PHP与MYSQL,php,mysql,performance,Php,Mysql,Performance,在stackoverflow上进行标签搜索这样的“运行总计”系统的最佳方法是什么?例如,如果我点击'php',它会显示'each'其他标记上的项目总数,而且速度非常快。如何在php中使用mysql实现这一点?我想他们只是在使用一个简单的选择count(*)从问题中选择tag=$tagname,它被缓存在memcached中。(这是一个“看起来”像这样的查询 SELECT T2.Tag, COUNT(*) FROM SO_Posts P1 JOIN Post_Tags T1 ON P.PostId
选择count(*)从问题中选择tag=$tagname
,它被缓存在memcached中。(这是一个“看起来”像这样的查询
SELECT T2.Tag, COUNT(*)
FROM SO_Posts P1
JOIN Post_Tags T1 ON P.PostId = T1.PostId
JOIN Post_Tags T2 ON P.PostId = T2.PostId
GROUP BY T2.Tag
WHERE T1.Tag = 'PHP'
ORDER BY COUNT(*) DESC
此查询假设SO上的帖子(问题)存储在两个表中;SO_帖子,每个帖子包含一条记录,并包含帖子ID(主键)、问题本身、日期、标题等信息。
和
Post_标记,将给定的Post(通过其Post_Id)与标记(或者更可能是TagId,因为标记应该规范化,但这是一个细节)关联。对于给定的Post,Post_标记中的记录与附加到Post的不同标记一样多。
注意:实际上,SO Posts数据库的结构更为复杂,有各种用于存储评论、回复等的表。但就Post-to-Tag关系而言,这种两表布局(或者更可能是3表布局,允许在Post_标记中使用tagId,而不是标记本身)抓住了显示这些过滤的agregate计数的可能性、简单性和快速性(提供了正确的索引)的本质 其思想是找到与目标标记(这里是“PHP”)相关联的所有帖子(在“T1”中查找),然后按标记聚合所有帖子(在“T2”中)
请注意,这里不需要主表SO_Posts,但它可能是查询的一部分,例如,允许添加额外的条件,例如Post状态(未关闭…).我也这么认为,但如果你要做这么多次,这不是很耗时吗?有没有可能他们有一个单独的标签表,每次添加问题时,他们都会+1。我想你没有抓住OP对“相关标签”显示的疑惑计数,针对给定的标签。在这种情况下,到目前为止,发布的数量大约为350000个。对于具有给定标签的所有可能标签(有序标签对,可能是更好的描述),保留预先计算的计数表似乎不切实际+1、感谢您在我的原始回答中解释OP的问题,您的回答是正确的,特别是您提到加入
Posts
是可选的,但加入Post_标签本身是主要的想法。