现在提出的表结构是: -

data_table
->impressions
->clicks
->ctr

或者

data_table_1
->ctr

data_table_2
->impressions
->clicks

执行哪些查询?印象每秒大约有500个更新。每秒有大约1个更新的单击更新。 CTR每秒大约有500个更新。

现在,我的应用程序使用CTR对数据进行分类。 CTR是点击率的点击率 ctr = clicks/impressions. 。现在我已经意识到,除非有单击更新,否则CTR不需要更新,因为增加了文章的所有印象,这正在减少相同关系中的CTR,因此,除非有单击,否则CTR不需要要更新。

当前,更新查询就像“ update data_table set seet inspressions =印象 + 1,ctr =单击 /印象

这意味着,尽管一次仅执行了1个查询,但两个字段被更新。

现在的瓶颈是,这500个更新该表在此表上的选择放缓。每秒大约有20个选择。所以我想到了分开桌子。新的表样式建议更新发生在单独的表上,并且选择发生在单独的表上。包含印象的数据表非常频繁地更新,因此在其上执行的印象的更新确实可以加快该表上的性能。这意味着data_table_2上的选择也将更快,并且每次单击时都可以更新CTR。

因此,我只是想知道我是否应该使用新的表结构。您的建议是什么?我的建议的优点!

有帮助吗?

解决方案

也许这不是您问题的直接答案,但我认为重要的是要注意。

我认为您应该考虑使用REDIS,MEMCACHEDB,MONGDB,COUCHDB等NOSQL数据库。相关DBM不太适合这种使用。例如,每次更新任何列时(UPDATE data_table SET impressions = impressions + 1)缓存被删除,DB必须击中磁盘。

其他人认为您可以考虑的是在一段时间后使用该数据磁盘的大量。

例如,如果您能够负担得起一些障碍(请记住,memcache不持久数据),则可以在memcache中进行indmisions ++,并每5分钟更新DB中的数据。它将大大减少您的负载。

我希望它对您有帮助。

编辑:

存储CTR是一个好主意,它称为“非正式化”,如果经常需要的值,则可以在您的应用程序中使用。

其他提示

首先,我认为桌子索引很好,所以 something = something 谓词会很快导致相应的行,对吗?

进一步假设您的瓶颈是由于较高的更新速率而是磁盘通量,这根本不存储CTR值,因为可以轻松地即时计算?由于您似乎受到更新的限制,因此只有更新一个字段才能将数据写入磁盘的影响大约是一半的影响。在这种情况下,CPU可能相对闲置,为每个结果计算点击/印象应该是无问题的。您的方法将获得回报(再次假设磁盘是限制因素,假设它是并且可以通过查看CPU利用来轻松找到它),那么您的方法将带来可观的好处, iff 表或两个不同的磁盘上。

如果CPU原来是限制因素,那可能是因为 something = something 评估谓词非常复杂,在这种情况下简化这应该是主要问题,而不是分裂表。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top