ICode9

精准搜索请尝试: 精确搜索
首页 > 数据库> 文章详细

删除旧记录 – MySQL

2019-08-31 08:15:52  阅读:276  来源: 互联网

标签:sql mysql sql-delete


我目前正在寻找解决我遇到的基本问题的方法:删除旧记录.

为了解释这种情况,我有一个表,我将其称为table1,记录数量减少.通常它保持为空,因为它用于中继消息.这些消息在添加到数据库后的两秒钟内被读取,并被删除,以便不再读取它们.

但是,如果其中一个应该接收来自table1的消息的客户端脱机,则有几个消息可能会挂起.有时数百.有时甚至数千甚至数十万,甚至更多.

这不仅会损害客户端的性能,而且必须处理大量的消息,还会损坏保存在内存中的数据库,并且应该保留最少量的记录.

考虑到客户端每秒检查一次新消息,删除旧记录的最佳方法是什么?我考虑过添加时间戳,但这不会影响性能:它必须在插入时计算时间戳吗?我已经尝试过了,所有这些查询最终都在慢速查询日志中.

最好的解决方案是什么?我已经考虑过检查表是否在过去5秒内被更改,如果没有,我们可以安全地确保所有应该中继的消息已经被中继,并且可以擦除它.但是怎么做呢?

我已经考虑过每隔几分钟运行一次的事件,但我不确定如何实现对select / insert / delete查询没有(或无意义)影响的东西.

PS:当我注意到一些客户端处于脱机状态时,这种情况就会到来,并且有800万条消息待处理.

编辑:

我忘了提到存储引擎是MEMORY,因此所有记录都保存在RAM中.这是我想要摆脱这些记录的主要原因:因为数百万条甚至不存在的记录存放在RAM中,会对系统资源产生影响.

以下是错误日志的摘录:

# Query_time: 0.000283  Lock_time: 0.000070 Rows_sent: 0  Rows_examined: 96
SET timestamp=1387199997;
DELETE FROM messages WHERE clientid='100';
[...]
# Query_time: 0.000178  Lock_time: 0.000054 Rows_sent: 0  Rows_examined: 96
SET timestamp=1387199998;
DELETE FROM messages WHERE clientid='14';

所以我猜他们确实有一个相当小的延迟,但它在MySQL中有任何有意义的意义吗?我的意思是,在“现实生活”中,0.0003可能完全被忽略,因为它的意义不大,对于MySQL和大约10ms ping的连接可以说同样的话吗?

解决方法:

你的问题很有意思,但没有太多细节,所以我只能提出一般观点.

首先 – 已经存在许多消息排队解决方案,它们可以开箱即用.它们隐藏了数据存储,清理等的底层实现,并允许您专注于应用程序逻辑. RabbitMQ是一个流行的开源选项.

其次,除非您使用受约束的硬件,否则MySQL表中的数千条记录在大多数情况下不是性能问题,也不会在插入时生成时间戳.因此,我建议构建一个明显且简单明了的解决方案(因此不易出错) – 在消息表中添加时间戳列,并找到一种删除超过5分钟的消息的方法.您可以将此添加到逻辑中,该逻辑在交付后清理记录.只要您的查询达到索引列,我认为您不必担心成千上万的记录.

我会投入一些精力来创建一个性能测试套件,让您可以试验解决方案,看看哪个更快.这可能很棘手,特别是如果您想要测试具有多个客户端的方案,但您将通过完成这些方案了解有关应用程序性能特征的更多信息.

编辑:

你可以在表automatically set a timestamp value中找到一列 – 我总是发现它非常快.就像在 – 它在非常大的表(数千万行)上从来都不是问题.

我对内存存储引擎没有多少经验 – 但MySQL documentation表明数据修改操作(如插入或更新或删除)可能因锁定时间而变慢 – 这可以通过统计数据证实,其中锁定时间大致相同占总数的30%.

标签:sql,mysql,sql-delete
来源: https://codeday.me/bug/20190831/1774187.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有