2009-09-08 104 views
0

在交通非常繁忙的LAMP服务器上,我使用内存表来跟踪多个数据项作为计数器。它的实现是这样的:Php - 优化多个计数器增量

$query = "INSERT INTO daily_info_mem SET di_num=1 ,di_type=9, di_date = current_date(), di_sid= $sid_int ,di_name='user_counter' ON DUPLICATE KEY UPDATE di_num=di_num+1"; 

索引设置独特di_type和日期,因此,如果存在对于这个日期计数器然后di_type它被递增,如果不是为了此日期和数据类型的行与0值创建。

对于每个页面视图有几个这样的查询。这意味着几个MySQL调用。

是否可以优化该尽可能地为一个MySQL的通话将更新几个任意柜台,仍然保持如果需要创建行或增加淡水河谷如果它存在的想法?

+0

为什么不使用自动增量这样的东西来处理你的柜台? – 2009-09-08 09:53:45

+0

如果我是正确的,自动增量用于行级索引值。我正在增加一个字段,而不是行数 – Nir 2009-09-08 09:59:04

+0

你是指同一行内的“counter”字段吗?像ON DUPLICATE KEY UPDATE di_num = di_num + 1,c2 = c2 + 99,c3 = c3 + 47? – VolkerK 2009-09-08 10:11:46

回答

3

我建议完全重新考虑这种类型的查询。你在主要数据库中有很多东西可以更好地处理内存。是否绝对需要每次都立即更新MySQL?如果你能从MySQL和memcached中获得它,你会看到一个巨大的性能障碍,并且你可以随时在后台运行一个脚本来整理数据并定期将其推送到MySQL(比如说,每5分钟一次),这样你不要放任何东西。

如果绝对必须是在MySQL,你可能会更好使用HEAP表,而不是一个InnoDB表。你会失去“重复密钥”,但你总是可以使用存储过程/函数来进行更新。而且,您可以随时将定时查询/定时脚本“INSERT INTO ... SELECT FROM ...”更改为archive型表格,这样您就不会丢失任何东西。

或者,使用完全不同的数据库来存储您的统计数据。 MongoDB有upsert s和$inc rements,这使得它成为统计收集的一个非常好的选择。

+0

中的代码谢谢! 这个工作表是一个内存表。我每15分钟更新一次非内存表。 – Nir 2009-09-08 10:48:08

+0

然后我怀疑你已经达到了mysql可以为你提供的极限; mysql是一个很棒的小数据库,但它并不是一切的正确选择。在这种情况下,Memcached或MongoDB更适合。 – 2009-09-08 10:50:30