2017-09-06 57 views
1

我在加入多个包含数百万数据的表时遇到了order by的问题。但我得到的解决方案具有鲜明的作为,而不是加盟EXISTS将从以下问题如何使用order by,group by and join来提高查询性能

How to improve order by performance with joins in mysql

SELECT 
    `tracked_twitter` . *, 
    COUNT(*) AS twitterContentCount, 
    retweet_count + favourite_count + reply_count AS engagement 
FROM 
    `tracked_twitter` 
    INNER JOIN 
     `twitter_content` 
     ON `tracked_twitter`.`id` = `twitter_content`.`tracked_twitter_id` 
    INNER JOIN 
     `tracker_twitter_content` 
     ON `twitter_content`.`id` = `tracker_twitter_content`.`twitter_content_id` 
WHERE 
    `tracker_twitter_content`.`tracker_id` = '88' 
GROUP BY 
    `tracked_twitter`.`id` 
ORDER BY 
    twitterContentCount DESC LIMIT 20 OFFSET 0 

提高性能,但该方法解决了,如果我只需要结果从父表中设置。如果我想在父表之外执行分组计数和其他数学函数呢?我写了一个解决我的标准的查询,但需要20秒才能执行。我怎样才能优化它?

在此先感谢

+3

GROUP BY无效。将在新版本的MySQL上引发错误(除非在兼容模式下),并且在旧版本中返回不可预测的数据。一般的GROUP BY规则说:“如果指定了GROUP BY子句,SELECT列表中的每个列引用必须标识一个分组列或作为set函数的参数。” – jarlh

+0

请确认您的所有专栏名称。 “is_influencer”来自哪个表? 'tracked_twitter_id'? –

+0

@GordonLinoff我刚刚编辑了where条件,错误地添加了这两个条件。 – Tamizharasan

回答

2

鉴于查询已经是相当简单的我会来看一下,是选择...

  • 执行计划(找到你可以添加任何缺失索引)
  • 缓存(确保SQL已经在RAM中的所有数据)
  • 去正常化(打开查询到平选择)
  • 缓存中的数据在应用程序中(这样你就可以使用somethi NG像PLINQ就可以了)
  • 使用基于RAM的存储(Redis的,弹性)
  • 文件组的调整(物理移动的数据库,以更快的光盘)
  • 分区的表(到分布在多个物理磁盘的原始数据)

越往下走这个列表越是涉及解决方案。 我想这取决于你需要查询的速度有多快,以及你需要多少解决方案来扩展。