【发布时间】:2017-06-19 13:21:29
【问题描述】:
我想按b.hash 分组,但是这样做成本太高。有什么方法可以进行此查询,但也可以使用 group by 但更快?
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
【问题讨论】:
-
好吧,可悲的是没有。您正在发送 560 万行。这是一个相当大的数据块。首先,您需要发送它,接收端也需要缓冲它以接收它。解决方案是发送更少的数据。您需要发回 560 万行吗?
-
当涉及到分析器输出时,MySQL 中实际上存在一个小错误。它显示从 previous 步骤所花费的时间。这意味着它执行了大约 7 秒。现在,原因 - 因为要找到记录然后减少它们,它必须检查 560 万行。现在我们回到“它必须找到磁盘上的记录”的故事,这部分很慢,因为磁盘很慢。发生这种情况时,我们知道 I/O 有问题,我们想将 I/O 转移到 RAM,这就是著名的
innodb_buffer_pool_size变量发挥作用的地方。有时您只需检查所有数据。 -
总有一点你可以编写 SQL - 在我们的工作中,你的代码 / SQL 的好坏是有限度的。如果您达到了这个限制,如果您编写了一段出色的代码或 SQL,但它仍然很慢,那么就是这样 - 您要么希望获得更好的硬件,要么尝试将工作分散到更多机器上(如果可能的)。如果不是这样,你就会屈服于对可能发生的事情和需要做的事情的物理限制。在你的情况下 - 如果可能的话,我会通过增加
innodb_buffer_pool_size将 I/O 转移到 RAM。 -
我认为 straight_join 比分组更可能是您的问题。 stackoverflow.com/questions/512294/…
-
嗯,这有点问题,MyISAM 虽然在当时非常出色,但遗憾的是对于今天的服务器和用户来说有点过时了。恐怕我不能用 MyISAM 帮助你做到这一点,但是I'd suggest you give this question a read
标签: php mysql indexing query-performance