这是一个相当复杂的问题,但我会尽力描述它。
我目前有2个表在insta_id
上加入。
第一个表名为Soc_stat
,它包含许多Instagram帖子的条目。我在SQL查询中使用的列是insta_id
和main_tag
。
另一个表名为tags
,其中包含insta_id
以及与tag_names
一起使用的所有insta_id
。
f tags
表看起来像这样。
我当前的SQL查询看起来像这样
SELECT tag_names
FROM soc_stat
JOIN tags ON soc_stat.insta_id = tags.insta_id
WHERE main_tag = $hashtag
现在的问题是目前我在tags
表中有110000行,而上面的查询花了很长时间才会经常超时。但我想我可能找到了一个解决方案:main_tag
表中的soc_stat
始终在tag_names
表中的tags
下表示。
所以也许我不必加入这两张桌子?是不是只能检查包含tags
等于insta_id
的所有tag_name
的{{1}}表,然后获取所有$hashtag
那些链接到那些tag_names
的?
修改的
我刚刚使用insta_id
在我的查询中添加了一个标签,我知道存在问题,结果如下:
在这里,我已经在一个使用较少的主题标签上完成了它,它仍然很慢,但不会那么慢
答案 0 :(得分:1)
在非平凡大小的表中处理JOIN查询时,编写显示列名的查询始终是个好主意。那是因为对于每个列提供哪个表,性能很重要。通过阅读它也更容易理解查询的意图。
我猜你的查询;请验证您的hashtags
和main_tag
来自soc_stat
表。这个查询是否正确?
SELECT soc_stat.hashtags
FROM soc_stat
JOIN tags on soc_stat.insta_id = tags.insta_id
WHERE soc_stat.main_tag = $hashtag
接下来,我们可以理清查询的意图。它会返回hashtags
表格中每个条目的soc_stat
列,其中包含您在main_tag
中提供的$hashtag
值。但它也对tags
进行了JOIN,并且从不将该表的内容用于WHERE
子句或SELECT
子句。
我猜您的查询的意图是:
提供与我提供的条目相关联的所有标签的集合
main_tag
值。
但您的查询不会这样做。我相信你想要的是这个:
SELECT DISTINCT tags.tag_names
FROM soc_stat
JOIN tags on soc_stat.insta_id = tags.insta_id
WHERE soc_stat.main_tag = $hashtag
您应该验证此查询是否会产生对您有用的内容。
要使此查询正常运行,您需要一些复合索引。在soc_stat
表上,您应该将列(main_tag, insta_id)
索引到单个实例中。要满足您的查询,您需要在该表中找到main_tag
的特定值,然后您需要检索insta_id
的所有相关值。这种复合指数可以提高效率。
在tags
上,您应该为(insta_id, tag_names)
编制索引。那是因为查询会在知道insta_id
的情况下进入该表,并检索所有相关的tag_names
值。
CREATE INDEX index_ss_mt_ii ON soc_stat (main_tag, insta_id)
CREATE INDEX index_tg_ii_tn ON tags (insta_id, tag_names)
最后,我在查询中写了SELECT DISTINCT
以消除重复。在大型结果集中,这将花费一些时间。
尊敬的是,是时候为您的技能添加对SQL索引的理解了。 SQL的全部内容是从大型数据集中快速检索数据。此在线出版物非常适合此目的。 http://use-the-index-luke.com/
答案 1 :(得分:0)
您的查询 -
SELECT hashtags FROM soc_stat
JOIN tags on tags.insta_id = soc_stat.insta_id
WHERE soc_stat.main_tag = $hashtag
现在,您可以使用explain select ...
此外,当大数据涉及其经常缺失的索引时,查询会变慢
对于上述查询,如果尚未添加,则需要添加以下索引
alter table soc_stat add index main_tag_idx(main_tag);
alter table tags add index insta_id_idx(insta_id);
确保在添加索引之前备份表。