MySQL中的高频插入
我对MySQL中的高频插入有问题。我在网上搜索了很多,但没有找到一个很好的答案 我需要以非常高的频率记录大量事件(~3000次插入/秒=>2.6亿行/天),这些事件存储在InnoDB表中,如下所示:MySQL中的高频插入,mysql,performance,innodb,scalability,high-availability,Mysql,Performance,Innodb,Scalability,High Availability,我对MySQL中的高频插入有问题。我在网上搜索了很多,但没有找到一个很好的答案 我需要以非常高的频率记录大量事件(~3000次插入/秒=>2.6亿行/天),这些事件存储在InnoDB表中,如下所示: log_events : - id_user : BIGINT - id_event : SMALLINT - date : INT - data : BIGINT (data associated to this event) 我的问题是: -如何加速插入?活动由数千名访客发送,我们无法
log_events :
- id_user : BIGINT
- id_event : SMALLINT
- date : INT
- data : BIGINT (data associated to this event)
我的问题是:-如何加速插入?活动由数千名访客发送,我们无法批量插入
-如何限制IO写入?我们使用的是6*600 GB SSD驱动器,存在写入IO问题 你对这类问题有什么想法吗 谢谢
弗朗索瓦那张桌子上有外键吗?如果是这样的话,我会考虑删除它们,只在用于读取的COL中添加索引。这应该会提高写作水平 第二个想法是使用一些内存中的db(例如redis、memcache)作为队列,一些工作人员可以从中获取数据并批量(例如每2秒)插入mysql存储 如果不需要频繁读取,另一个选项是使用
archive
存储,而不是innodb:。但它看起来不是一个选项,只要它根本没有索引(这意味着完全扫描表读取)
另一个选择是重新组织数据库结构,例如使用分区()。但这取决于选择的外观
我的补充问题是:
- 你能给我看一下整张桌子的定义吗
- 哪些字段用于读取?你能给他们看看吗
- 您需要读取所有数据还是只需要最近的数据?如果是的话,最近的数据必须是多少?(例如,仅从最后一天/周/月/年开始)
- id_事件是一种事件类型,对吗?可能发生的事件数量是静态的,还是将来可能会发生变化
不过,只写数据库是无用的硬件。您还没有提供如何使用这些数据的任何细节,这与设计解决方案有一定的相关性。另外,由于理想情况下,数据馈送将是一个单进程/DB会话,因此使用MyISAM而不是InnoDB可能是一个更好的主意(我在您稍后的评论中看到,您说MyISAM有问题,可能是多个客户端的问题)。您是同时阅读此日志,还是离线阅读?如果没有,您最好登录到一个文件,然后导入到您的RDBMS中?如果您确实需要日志立即进入RDBMS,是否需要强制ACID合规性?我们可以接受事件发生与数据库中的可用性之间的5分钟延迟。我想把事件记录到一个日志文件中的文件系统中,但我想我们会有很大的并发写入问题不是吗?除了使用RDBMS,还有其他处理并发性的方法:如果这是你唯一的动机,那就像用大锤敲开一个螺母一样。阅读查询的频率有多高?您必须维护哪些索引(如果有)?你需要强制ACID合规吗?@eggyal关于索引,我们有:#日期#id#事件/数据#id#事件/日期/数据#id#用户我们不需要ACID合规。阅读查询最多可能是每分钟1次。您能告诉我您使用的是什么操作系统,MySQL的数据文件存储在什么文件系统上吗?我倾向于建议您构建一个(线程安全的)应用程序,该应用程序写入RAM中的缓冲区,并在缓冲区满后刷新RDBMS。由于您不需要ACID遵从性,您可能会发现InnoDB正在生成您不需要的IO;也许另一个存储引擎,如MyISAM,更适合您?但我投票支持迁移到,因为他们会更好地了解如何为这个应用程序优化MySQL安装。