我的SQL查询速度很慢,超时。另一种方法?

时间:2015-09-23 08:46:29

标签: mysql sql database indexing query-optimization

这是一个相当复杂的问题,但我会尽力描述它。

我目前有2个表在insta_id上加入。

第一个表名为Soc_stat,它包含许多Instagram帖子的条目。我在SQL查询中使用的列是insta_idmain_tag

另一个表名为tags,其中包含insta_id以及与tag_names一起使用的所有insta_id

f tags表看起来像这样。

enter image description here

我当前的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在我的查询中添加了一个标签,我知道存在问题,结果如下:

enter image description here

在这里,我已经在一个使用较少的主题标签上完成了它,它仍然很慢,但不会那么慢

enter image description here

2 个答案:

答案 0 :(得分:1)

在非平凡大小的表中处理JOIN查询时,编写显示列名的查询始终是个好主意。那是因为对于每个列提供哪个表,性能很重要。通过阅读它也更容易理解查询的意图。

我猜你的查询;请验证您的hashtagsmain_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值。

像这样的DDL命令创建了这些索引:

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);

确保在添加索引之前备份表。