0

在流量非常大的 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 和日期,因此如果该日期存在计数器,则 d​​i_type 递增,如果不是该日期的行并且数据类型创建为 0 值。

每个页面视图都有几个这样的查询。这意味着几个mysql调用。

是否有可能将其尽可能优化为一个 mysql 调用,该调用将更新多个任意计数器,并且仍然保留在需要时创建行或增加值(如果存在)的想法?

4

1 回答 1

3

我建议完全重新考虑这种类型的查询。您在那里经常使用您的主数据库,以获得可以在内存中更好地处理的东西。每次都必须立即更新 MySQL 吗?如果您可以将其从 MySQL 中取出并放入 memcached,您会看到巨大的性能提升,并且您始终可以在后台运行一个脚本来整理数据并定期(例如,每 5 分钟)将其推送到 MySQL,这样您不要丢失任何东西。

如果它绝对必须在 MySQL 中,那么使用 HEAP 表而不是 InnoDB 表可能会更好。您将丢失“重复键”,但您始终可以使用存储过程/函数进行更新。再一次,你总是可以有一个预定的查询/定时脚本“INSERT INTO ... SELECT FROM ...”到一个archive-type表,这样你就不会丢失任何东西。

或者,使用完全不同的数据库来存储您的统计数据。MongoDB 有upserts 和$increments 这使它成为统计收集的一个很好的选择。

于 2009-09-08T10:23:03.833 回答