2011-03-28 51 views
0

我想做大量的插入,但是有可能在一段时间后更新mysql。缓存的mysql插入 - 保留数据的完整性

例如,如果有作为

Update views_table SET views = views + 1 WHERE id = 12; 

这样的查询难道是不可能的,也许存储该询问,直到观点已经上升到100,然后运行下面的,而不是从上面运行查询100次。

Update views_table SET views = views + 100 WHERE id = 12; 

现在,让我们说完成,然后来了数据完整性的问题。比方说,有100个php文件打开,它们都将运行相同的查询。现在,除非增加缓存视图的锁定机制,否则多个文件可能具有相同的缓存视图值,因此可以说流程1可能有25个缓存视图,而php流程2可能有25个视图并处理3可能有27个来自文件的视图。现在让我们说过程3完成并将计数器增加到28.然后让我们说php过程是关于完成的,并且在过程3之后完成,这意味着计数器将被降回到26.

所以,你们有任何快速的解决方案,但也是数据安全的。

感谢

回答

2

只要您的查询使用相对views=views+5,应该有没有问题

只有当您将脚本中的值存储在脚本中,然后自己计算新值时,您可能会遇到麻烦。但是,你为什么要这样做?其实,为什么你想要首先做这个? :)

如果您不想过载数据库,则可以使用UPDATE LOW_PRIORITY table set ...LOW_PRIORITY keyword会将更新操作置于队列中,并等待表不再被读取或插入使用。

+0

好的答案,但只是为了澄清:一个'LOW_PRIORITY'查询仍然'挂起',直到它可以运行(给予时间来读取和插入的确是,但不是当前进程),它明显不同于'例如INSERT DELAYED'(这里不能使用它,但是*会*将INSERT放入队列中,并且可以让你继续快乐的方式)。这里讨论的关于'LOW_PRIORITY'的队列已经是'等待访问'的进程。 – Wrikken 2011-03-28 22:03:08

+0

哦好吧,那太好了......如果每秒有数千次更新,那么情况如何呢? – Vish 2011-03-29 10:26:00

0

首先:使用这些查询:无论何时启动进程,UPDATE .. SET col = col + 1都是安全的操作,所以它不会“减少”计数器。

关于'存储此查询,直到视图已上升到100,然后运行以下而不是运行100次以上的查询':不是真的。你可以在更快的内存中存储一​​个计数器(memcached可以想到),并且可以在一段时间内将数据传输到数据库,或者使用AFTER UPDATE触发器将其存储在另一个表中,但我并不认为这一点很重要那。

+0

因此,您建议将查询次数设为100次 – Vish 2011-03-28 22:42:17

+0

A每周100次?每天?每分钟? – Konerak 2011-03-29 09:19:58

+1

如果你真的需要运行它很多次,而你的数据库无法跟上,你可能会考虑使用类似memcached的东西来存储变量,并且每X次更新一次数据库 - 但只要没有问题,不要过早开始优化。 – Konerak 2011-03-29 09:21:07