Mysql 使用memached减少数据库写入

Mysql 使用memached减少数据库写入,mysql,memcached,Mysql,Memcached,我想将我的统计跟踪系统转换为不直接写入数据库,因为我们遇到了瓶颈 我们目前正在为站点的某些方面使用memcached,我想用它来存储统计数据并定期将它们提交到mysql数据库 然而,问题在于在cronjob运行之间可能会收集到将其提交到数据库的统计数据的项目数量(以百万计)。除了运行SELECT*FROM data并检查每个memcache键是否存在,然后更新表之外。。。。有没有其他方法可以做到这一点?(我不是说下面是福音,这只是我的直觉。正如后面所说的,我不知道你的系统的细节:)显然没有冒犯的

我想将我的统计跟踪系统转换为不直接写入数据库,因为我们遇到了瓶颈

我们目前正在为站点的某些方面使用memcached,我想用它来存储统计数据并定期将它们提交到mysql数据库

然而,问题在于在cronjob运行之间可能会收集到将其提交到数据库的统计数据的项目数量(以百万计)。除了运行
SELECT*FROM data
并检查每个memcache键是否存在,然后更新表之外。。。。有没有其他方法可以做到这一点?

(我不是说下面是福音,这只是我的直觉。正如后面所说的,我不知道你的系统的细节:)显然没有冒犯的意思等:)

我建议不要为此使用memcached。Memcached是一种快速检索以前获得的值的构建,而不是存储值。最大的区别是,缓存已满,数据将丢失

通常情况下,缓存中没有数据,从源中重新收集数据,这在本例中是不可能的。这就是我试图劝阻你不要这样做的原因

现在你说主要的问题是你遇到的mysql连接限制。如果你做一些简单的事情(比如我们在评论中提到的:
insert delayed
),这只是增加限制的一个例子。您应该有足够的能力让您的脚本/用户访问数据库一次,然后说“这最终应该被添加”,然后离开。如果您的用户甚至无法为此打开1个连接,那么您可能无法通过添加额外的缓存层来解决严重的资源问题


显然很难说没有任何系统、软件和硬件的规范,但我的建议是看看你是否可以通过增加限制让他们打开连接,并稍微调整一下服务器变量,而不是使用memcached作为中间层来修补系统。

我在统计数据方面也遇到了类似的问题。但请不要使用memcached。您无法确保所有项目都将移动到DB。您可以松散数据和/或双重处理数据

您应该根据正在写入/读取的数据量和需要的连接数分析瓶颈。而不是切换到Hadoop、Cassandra、Scripe和其他可扩展的系统

  • 您需要在正在运行的平台上提供其他信息:O/S、数据库(版本)、存储引擎、RAM、CPU(如果可能)

  • 您是插入到单个表中还是插入到多个表中

  • 您可以禁用要插入的表上的索引,因为这会减慢插入函数的速度

  • 在插入原始数据时,是否运行触发器或存储过程来计算值


  • 这听起来就像MySQL中的
    insert delayed
    功能性allready?也许这是另一种选择。已经在使用它了,但在高峰时间仍然达到mysql连接限制。数据库已经尽可能地优化了。我们甚至雇佣了Percona从中榨取每一点,但是连接的数量实在太多了。关于memcache,您确实有一个非常正确的观点,但是据我所知,它会弹出最旧的数据。统计数据在提交到DB之前只会存在几分钟。1是内存,2是磁盘。您可能会认为这两个方面都存在瓶颈,但在这种情况下,数据库连接似乎是问题所在?如果光盘没有问题,您可以用比数据库更简单的方式将数据保存到光盘中,然后用脚本导入。也就是说,如果数据库连接确实是唯一的问题,那么I/O将不会便宜。也许有一种基于内存的中间解决方案是可能的,但我不能向您推荐:)听起来您可能需要投资一些新的硬件,然后……)使用最新的Ubuntu和mysql 5.1.59。48GB ram,双四路CPU。大多数表都是InnoDB。3个表需要插入/更新。其中两个表同时进行大量读取,因此需要索引。没有触发器或过程。您是否使用innodb_file_per_table?您的innodb_缓冲区_池_大小有多大-表是否适合内存?这可能会提高性能