Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/86.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
索引良好的MySQL查询需要很长时间才能执行。“解释”显示了3m行。可以加快还是改进?_Mysql_Sql_Database - Fatal编程技术网

索引良好的MySQL查询需要很长时间才能执行。“解释”显示了3m行。可以加快还是改进?

索引良好的MySQL查询需要很长时间才能执行。“解释”显示了3m行。可以加快还是改进?,mysql,sql,database,Mysql,Sql,Database,我有一个数据库,其中包含超过1亿行reddit评论数据,格式如下: { author: redditauthor1, body: example comment, subreddit: /r/funny, .... } 我正在尝试获取一个用户列表,其中包含他们发布的所有子插件的评论数量。我也在缩小它的范围,因为用户也在我作为参数传递的subreddit中发布了它 对于这个表,我有4个索引。原因是我暂时只打算读这本书。索引如下所示: CREATE INDEX idx_subreddit

我有一个数据库,其中包含超过1亿行reddit评论数据,格式如下:

{
 author: redditauthor1,
 body: example comment,
 subreddit: /r/funny,
 ....
}
我正在尝试获取一个用户列表,其中包含他们发布的所有子插件的评论数量。我也在缩小它的范围,因为用户也在我作为参数传递的subreddit中发布了它

对于这个表,我有4个索引。原因是我暂时只打算读这本书。索引如下所示:

CREATE INDEX idx_subreddit
ON comments(subreddit);

CREATE INDEX idx_author
ON comments(author);

CREATE INDEX idx_authsub
ON comments(author, subreddit);

CREATE INDEX idx_subauth
ON comments(subreddit, author);
我还尝试将其缩小到subreddit,作者索引,但没有任何改进。通过从行列表中删除[deleted]用户,我进一步缩小了搜索范围。我的质询如下:

SELECT author, subreddit, count(*) as numcomments 
from comments
WHERE author IN (SELECT author FROM comments WHERE subreddit="politics"  AND author != "[deleted]")
group by author, subreddit
ORDER BY author
LIMIT 100
;
根据我的解释计划,这将返回300万行,这是一个接近100Gb的数据集

对于大型子Reddit(如/r/politics),查询运行时间远远超过300秒。活动量较小的机器运行一秒钟或更短时间。我能做些什么来提高执行时间吗?我尝试通过EverSQL运行查询,并使用他们指定的查询以及他们推荐的单个subreddit、author复合索引,但这实际上使运行时变得更糟。我知道有第三方选项,比如利用google bigquery的pushShift API,但因为我想离线工作,所以我想在本地完成。最后,我想自己获取所有评论并“计算”它们,而不是使用mySql的count(*)方法和group by,但即使如此,查询也需要一段时间来检索我必须在后端处理的所有评论(1500万条)。有解决办法吗?像Redis缓存系统?分区?如果可能的话,我希望在3秒钟内完成这个查询。任何反馈都将不胜感激


根据用户的建议,我已对此查询进行了解释:


SELECT x.author
     , x.subreddit
     , COUNT(*) numcomments 
  FROM comments x
  JOIN  
     ( SELECT author 
         FROM comments 
        WHERE subreddit = "politics"  
          AND author != "[deleted]"
     ) y
    ON y.author = x.author
 GROUP 
    BY x.author
     , x.subreddit;

解释产生了这样的结果:

直接在主查询中移动条件。通过添加两个选项,您至少完成了两倍的工作。祝你好运

SELECT author, subreddit, count(*) as numcomments 
from comments
WHERE subreddit="politics"  AND author != "[deleted]"
group by author, subreddit
LIMIT 100
;

为什么不直接将
WHERE
条件放在外部查询上,而不是进行基本上查询同一个表的子查询呢?正如@tcadidot0所说的,尝试不使用子查询。结果应该是一样的。从subreddit=“politics”和author!=“[已删除]”按作者分组,subreddit限制100。对不起,我可能应该在我的问题中指定更好的内容,但我想要每个subreddit中所有作者的帖子的列表。通过删除第二个查询,我只得到指定子Reddit中作者的帖子列表,而我想要的是作者每个子Reddit的评论数“谁也在'/r/politics'上发表过文章。你从子查询中得到了多少作者?可以,我会提供一个更新,并表示一些歉意。我可能没有尽力澄清,我不想只在指定的“子Reddit”中发表文章。”但是我想要的是所有作者的帖子,他们也在我指定的subreddit参数中发布过。这就是为什么我使用带有exists的子查询。也许加入会更好?明白。例如,您可能需要加入评论两次。从comments commentA加入comments commentB on commentA.author=commentB.author和commentB.subreddit=“politics”。