2011-09-05 54 views
1

现在所提出的表结构是: -50/50插入和选择。创建两个表或一个表

data_table 
->impressions 
->clicks 
->ctr 

OR

data_table_1 
->ctr 

data_table_2 
->impressions 
->clicks 

执行什么疑问? 展示次数每秒约有500次更新。每秒约有1次点击更新。中心每秒约有500次更新。

现在我的应用程序使用ctr对数据进行排序。 ctr是由ctr = clicks/impressions制定的点击率。现在我已经意识到,除非有点击更新,否则ctr不需要更新,因为文章的所有印象正在增加,这会降低同一关系中的ctr,因此除非有点击,否则ctr不需要被更新。

目前更新查询是像“UPDATE data_table SET曝光=展示+ 1,CTR =点击/展示WHERE东西=东西

这意味着,虽然2个字段被一次更新仅执行1查询。

现在的瓶颈是这500个更新导致这个表上的选择减慢每秒约有20个选择所以我想分离表格新的表格样式提出更新发生在单独的表和选择发生在一个单独的表上包含印象的数据表被更新得非常频繁,因此对印象进行更新perf以此为基础确实加快了这张桌子的表现。这意味着data_table_2上的选择也会更快,并且每次有人点击时都可以更新ctr。

所以,我只是想知道我是否应该使用新的表格结构。你有什么建议?我的建议的优点和缺点!

+1

为什么'ctr'列甚至存在,考虑到它是从其他列派生的?为什么你不能只用一个视图来投影'ctr'? – cdhowie

+1

你使用这些表的数据库引擎是什么? –

回答

0

也许这不是对你的问题的直接回答,但我认为这很重要。

我认为你应该考虑使用Redis,MemcacheDB,MongDB,CouchDB等nosql数据库。相对DBMS不适合这种用途。例如,每次更新任何列(UPDATE data_table SET impressions = impressions + 1)时,高速缓存都将被删除,并且数据库必须打开磁盘。

其他认为可以考虑在一段时间后使用Memcache并将该数据散装到磁盘。例如,如果你可以承受松散的压力(记住,memcache不会持久数据),你可以在memcache中执行impresions ++,并每5分钟更新一次数据库中的数据。这会显着降低你的负载。

我希望它能帮助你。

编辑

贮藏CTR是一个好主意,这就是所谓的“非规范化”,并在您的应用程序可能会工作,如果这是一个经常需要的值。

+0

关于如何使用这个模型与PHP的任何见解。我已经考虑过这一点,但真正的问题是我不知道如何更新它“每5分钟”应该编码。我不想使用cron作业。 – Anush

+0

是的,你可以使用cron,这将是最好的选择。这取决于您的服务器和您拥有的访问/知识。如果你能让cron工作,就这样做!如果没有,那么你应该在你的php脚本中添加一些硬编码的工作。你可以在memcache中存储一个时间戳并从那里读取,计算一些时间并在数据库过期时保存到数据库。 – santiagobasulto

1

首先,我假设表格的索引很好,所以something = something谓词会很快产生相应的行,对吧?

进一步假设你的瓶颈是磁盘吞吐量,因为它的更新率很高,那么根本就不需要存储ctr值呢?由于您的更新似乎受到限制,因此只需更新一个字段大概只需将数据写入磁盘的一半即可。鉴于这种情况,在CPU可能相对空闲的情况下,计算每个结果的点击次数/展示次数应该不成问题。你的方法会得到回报(再次假设磁盘是限制因素,假设它是并且通过查看CPU利用率可以很容易地发现),那么你的方法将给予相当大的好处,如果这些表或两个不同的磁盘上。

如果CPU结果是限制因素,那么这可能是因为在评估这种情况下,简化这个应该是主要关注点,而不是分割表。

+0

感谢您的回答。 CPU使用率低于50%。瓶颈是更新次数过多。 – Anush

+0

@Anush,你还没有回答Michael的问题。该表是否使用MyISAM或InnodB引擎? –

+0

MyISAM,innodb崩溃 – Anush

相关问题