更新views_24hours,views_7days,views_30days太慢了

时间:2010-10-01 22:10:08

标签: sql mysql performance

我的表格(MyISAM)包含views_totalviews_24hviews_7dviews_30d列。 views_24h =查看过去24小时,views_7d =过去7天等等。所有这些列都是INT和INDEX,因为我正在按他们排序。

每小时(24小时)或每天(7天,30天)我使用UPDATE ... JOIN (... UNION ALL ...) USING ... SET ...更新此列更新本身大约需要2.5秒。 (100-120K行),但在更新此列之前,我应将它们设置为null。所以,我正在制作UPDATE table SET views_24h = 0,此查询大约需要4秒钟。

有没有办法加快这个更新?也许,我应该为此目的选择另一种算法或其他数据模型?也许,我应该将这些字段分成另一个表,然后执行DELETE(但是在显示时我会在JOIN期间导致加载)?

我有非常好的NoSQL解决方案(Redis的ZSET数据类型),但我想先了解如何在MySQL中快速完成...

谢谢。

1 个答案:

答案 0 :(得分:2)

你说你有索引,但我想这些索引不用于UPDATE,只用于排序SELECT查询。因此,这些索引实际上会降低UPDATE的性能。

通常我的建议是在UPDATE期间索引的开销超过了它们在SELECT期间的好处。在您的情况下也可能是这样,但您询问了如何加快更新速度,以便我们专注于此。

您应该使用EXPLAIN分析查询,但MySQL不支持EXPLAIN UPDATE。因此,您必须使用等效的SELECT来分析优化:

EXPLAIN SELECT * FROM ... JOIN ( ...UNION ALL... ) USING...

这应该告诉你它是否正在使用其他索引来帮助这个连接。我没有提供更具体的建议,因为您没有显示完整的UPDATE查询,或者任何表的完整结构,或者它们可能具有的其他索引。

另一个提示可能是在UPDATE之前删除视图计数列上的索引,以减少开销。然后在UPDATE之后重建索引。这可能会使UPDATE更快,但删除和重新创建索引也会很昂贵。