首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >更新views_24hours、views_7days、views_30days太慢

更新views_24hours、views_7days、views_30days太慢
EN

Stack Overflow用户
提问于 2010-10-02 06:10:08
回答 1查看 31关注 0票数 0

我有一个表(MyISAM),其中包含列views_totalviews_24hviews_7dviews_30dviews_24h =最近24小时的视图,views_7d =最近7天等等。所有这些列都是INT和INDEX,因为我是按它们进行排序的。

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

有没有办法加速这个更新?也许,我应该选择另一种算法或另一种数据模型来实现此目的?也许,我应该将这些字段分离到另一个表中,然后只执行DELETE (但在显示时,我会在JOIN期间导致load )?

我对此有非常好的NoSQL解决方案(Redis的ZSET数据类型),但我想首先了解如何在MySQL中快速完成这项工作……

谢谢。

EN

回答 1

Stack Overflow用户

发布于 2010-10-02 06:25:17

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

通常,我的建议是,索引在更新期间的开销超过了它们在SELECT期间的好处。在你的情况下可能也是如此,但你问到了如何加快更新速度,所以我们将重点放在这一点上。

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

代码语言:javascript
复制
EXPLAIN SELECT * FROM ... JOIN ( ...UNION ALL... ) USING...

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

另一个技巧可能是在更新之前删除view-count列上的索引,以减少开销。然后在更新后重新构建索引。这可能会使更新更快,但删除和重新创建索引的成本也会很高。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3843360

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档