替代方式" group by"避免低性能速度?

时间:2017-02-02 12:51:38

标签: php mysql indexing query-performance

我希望按b.hash进行分组,但这样做成本太高。有没有办法让这个查询,但也有组,但更快?

SELECT STRAIGHT_JOIN b.hash, b.page, n.favorite
FROM behaviour b, new_table n
WHERE b.timestamp >= NOW( ) - INTERVAL 20 SECOND 
AND b.hash = n.hash

这是EXPLAIN

enter image description here

PROFILING

enter image description here

2 个答案:

答案 0 :(得分:0)

我猜你想要这个查询

SELECT b.hash, b.page, n.favorite
  FROM behaviour b
  JOIN new_table n ON b.hash = n.hash
 WHERE b.timestamp >= NOW( ) - INTERVAL 20 SECOND 
   AND b.hash = n.hash
 ORDER BY b.hash

我不理解您在问题中对GROUP BY的评论。看起来你想要最新的三分之一分钟的物品。

无论如何,如果您在包含以下列的behaviour表上创建复合索引,您的查询可能会以可接受的速度开始运行。

 (timestamp, hash, page)

为什么呢? MySQL的查询计划程序可以随机访问索引,从查询中的timestamp值开始。那个O(log n)很快。然后,它可以按顺序扫描索引以获取查询所需的信息。那几乎是瞬间的。

你有可能想要这个吗?

SELECT b.hash, b.page, MAX(n.favorite)
  FROM behaviour b
  JOIN new_table n ON b.hash = n.hash
 WHERE b.timestamp >= NOW( ) - INTERVAL 20 SECOND 
   AND b.hash = n.hash
 GROUP BY b.hash, b.page

还是这个?

SELECT b.hash, b.page, GROUP_CONCAT(n.favorite)
  FROM ...

答案 1 :(得分:0)

请为这两个表提供SHOW CREATE TABLE。与此同时,我猜......

b没有以timestamp开头的索引,但它需要这样的索引。

像往常一样,分析是无用的' - 99%的指示时间用于模糊"发送数据"。