我的表格(MyISAM)包含views_total
,views_24h
,views_7d
,views_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中快速完成...
谢谢。
答案 0 :(得分:2)
你说你有索引,但我想这些索引不用于UPDATE,只用于排序SELECT查询。因此,这些索引实际上会降低UPDATE的性能。
通常我的建议是在UPDATE期间索引的开销超过了它们在SELECT期间的好处。在您的情况下也可能是这样,但您询问了如何加快更新速度,以便我们专注于此。
您应该使用EXPLAIN
分析查询,但MySQL不支持EXPLAIN UPDATE。因此,您必须使用等效的SELECT来分析优化:
EXPLAIN SELECT * FROM ... JOIN ( ...UNION ALL... ) USING...
这应该告诉你它是否正在使用其他索引来帮助这个连接。我没有提供更具体的建议,因为您没有显示完整的UPDATE查询,或者任何表的完整结构,或者它们可能具有的其他索引。
另一个提示可能是在UPDATE之前删除视图计数列上的索引,以减少开销。然后在UPDATE之后重建索引。这可能会使UPDATE更快,但删除和重新创建索引也会很昂贵。