Mysql 50/50插入和选择。创建两个表或一个表

Mysql 50/50插入和选择。创建两个表或一个表,mysql,database,optimization,database-performance,Mysql,Database,Optimization,Database Performance,现在建议的表格结构是:- data_table ->impressions ->clicks ->ctr 或 执行什么查询? 每秒大约有500次印象更新。大约每秒有1次点击更新。ctr每秒大约有500次更新 现在,我的应用程序使用ctr对数据进行排序。点击率是点击率,由点击率=点击率/印象率计算得出。现在我意识到,除非点击更新,否则ctr不需要更新,因为所有文章的印象都在增加,这会降低同一关系中的ctr,因此,除非点击更新,否则ctr不需要更新 当前更新查询类似于“更新数据\

现在建议的表格结构是:-

data_table
->impressions
->clicks
->ctr

执行什么查询? 每秒大约有500次印象更新。大约每秒有1次点击更新。ctr每秒大约有500次更新

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

当前更新查询类似于“更新数据\u表集印象=印象+1,ctr=点击/印象,其中某物=某物”

这意味着,尽管两个字段一次更新,但只执行一个查询

现在的瓶颈是,这500次更新导致此表上的选择速度减慢。每秒大约有20次选择。因此,我考虑将表分开。新的表样式建议更新发生在单独的表上,选择发生在单独的表上。包含印象的数据表是更新的d非常频繁,因此对其执行印象更新确实会加快此表的性能。这意味着数据表2上的选择也会更快,并且每次有人单击时都可以更新ctr


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

首先,我假设该表索引良好,因此
something=something
谓词将快速生成相应的行,对吗

进一步假设由于高更新率,您的瓶颈是磁盘吞吐量,那么根本不存储ctr值怎么样,因为它可以很容易地动态计算?因为您似乎受到更新的限制,只更新一个字段应该大约是必须将数据写入磁盘的影响的一半。在这种情况下CPU可能相对空闲,计算每个结果的点击/印象应该不是问题。您的方法会有回报(再次假设磁盘是限制因素,假设它是,并且可以通过查看CPU利用率轻松找到),则您的方法将提供相当大的好处,无论是在表中还是在两个不同的磁盘上


如果CPU被证明是限制因素,那么这可能是因为
something=something
谓词的计算非常复杂,在这种情况下,简化它应该是主要考虑的问题,而不是拆分表。

首先,我假设表索引良好,因此
something=something
predicate将快速生成相应的行,对吗

进一步假设由于高更新率,您的瓶颈是磁盘吞吐量,那么根本不存储ctr值怎么样,因为它可以很容易地动态计算?因为您似乎受到更新的限制,只更新一个字段应该大约是必须将数据写入磁盘的影响的一半。在这种情况下CPU可能相对空闲,计算每个结果的点击/印象应该不是问题。您的方法会有回报(再次假设磁盘是限制因素,假设它是,并且可以通过查看CPU利用率轻松找到),则您的方法将提供相当大的好处,无论是在表中还是在两个不同的磁盘上


如果CPU被证明是限制因素,那么这可能是因为
something=something
谓词的计算非常复杂,在这种情况下,简化它应该是主要考虑的问题,而不是拆分表。

也许这不是对您的问题的直接回答,但我认为需要注意这一点。

我认为你应该考虑使用ReSQL、MeMcAdEdB、MungDB、CouCHDB等NoSQL数据库。关联DBMS不适合这种使用。例如,每次更新任何列(<代码>更新数据表集印象(=印象+ 1)/代码>)时,缓存被擦除,DB必须命中磁盘。

其他人认为你可以考虑在一段时间后使用MyCask和大量的数据到磁盘。 例如,如果您可以释放一些提示(记住memcache不会持久化数据),您可以在memcache中执行Impressions++并每5分钟更新数据库中的数据。这将显著降低您的负载

我希望它能帮助你

编辑


存储CTR是一个好主意,它被称为“非规范化”,如果它是一个经常需要的值,它可能在您的应用程序中起作用。

也许这不是对您的问题的直接回答,但我认为需要注意这一点

我认为你应该考虑使用ReSQL、MeMcAdEdB、MungDB、CouCHDB等NoSQL数据库。关联DBMS不适合这种使用。例如,每次更新任何列(<代码>更新数据表集印象(=印象+ 1)/代码>)时,缓存被擦除,DB必须命中磁盘。

其他人认为你可以考虑在一段时间后使用MyCask和大量的数据到磁盘。 例如,如果您可以释放一些提示(记住memcache不会持久化数据),您可以在memcache中执行Impressions++并每5分钟更新数据库中的数据。这将显著降低您的负载

我希望它能帮助你

编辑


存储CTR是一个好主意,它被称为“非规范化”,如果它是一个经常需要的值,它可能在您的应用程序中起作用。

为什么
CTR
列甚至存在,因为它是从其他列派生的?为什么不能只使用视图t
data_table_1
->ctr

data_table_2
->impressions
->clicks