我希望按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
PROFILING
答案 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%的指示时间用于模糊"发送数据"。