Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/63.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用每个项目的总金额优化搜索。PHP与MYSQL_Php_Mysql_Performance - Fatal编程技术网

使用每个项目的总金额优化搜索。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

在stackoverflow上进行标签搜索这样的“运行总计”系统的最佳方法是什么?例如,如果我点击'php',它会显示'each'其他标记上的项目总数,而且速度非常快。如何在php中使用mysql实现这一点?

我想他们只是在使用一个简单的
选择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_标签本身是主要的想法。