在一个非常繁忙的流量LAMP服务器上,我正在使用内存表来跟踪几个数据项作为计数器。它实现如下:
$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 :(得分:3)
我建议完全重新考虑这种类型的查询。你可以在那里点击你的主要数据库,以便在内存中更好地处理。是否绝对需要每次都立即更新MySQL?如果你可以从MySQL中获取它并进入memcached你会看到一个巨大的性能提升,并且你总是可以在后台运行一个脚本来整理数据并定期将它推送到MySQL(比如,每隔5分钟),这样你就可以了不要丢失任何东西。
如果绝对必须在MySQL内部,那么最好使用HEAP表而不是InnoDB表。您将丢失“重复键”但您可以始终使用存储过程/函数来执行更新。而且,您可以始终将预定的查询/定时脚本“INSERT INTO ... SELECT FROM ...”添加到archive
类型的表中,这样您就不会丢失任何内容。
或者,使用完全不同的数据库来存储您的统计数据。 MongoDB具有upsert
和$inc
个rements,这使它成为统计数据收集的一个很好的选择。