Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/56.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MySQL中的高频插入_Mysql_Performance_Innodb_Scalability_High Availability - Fatal编程技术网

MySQL中的高频插入

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) 我的问题是: -如何加速插入?活动由数千名访客发送,我们无法

我对MySQL中的高频插入有问题。我在网上搜索了很多,但没有找到一个很好的答案

我需要以非常高的频率记录大量事件(~3000次插入/秒=>2.6亿行/天),这些事件存储在InnoDB表中,如下所示:

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_事件是一种事件类型,对吗?可能发生的事件数量是静态的,还是将来可能会发生变化
活动由数千名观众发送,我们无法批量插入

您需要批量插入或切分数据。我会首先尝试批量插入路线

你认为你不能暗示这些事件是由自治进程创建的——你只需要通过一个中介而不是直接到数据库。将漏斗实现为基于事件的服务器(而不是线程或分叉服务器)是最容易的

您不会说事件是什么,也不会说它们起源于何处,这对实现解决方案的细节有一定的影响

rsyslog和syslogng都将与MySQL后端通信——因此您可以消除为每条消息建立新连接的开销——但我不知道它们是否实现了缓冲/批量插入。当然,可以通过单个进程跟踪它们生成的文件,并从中创建批量插入

使用它编写一个漏斗相对来说比较简单,还需要一些代码来实现异步mysqli调用和一个看门狗。或者你可以用。还有一些工具(同样使用node.js)也可以对数据上的数据执行一些聚合

或者你可以从头开始写一些东西


不过,只写数据库是无用的硬件。您还没有提供如何使用这些数据的任何细节,这与设计解决方案有一定的相关性。另外,由于理想情况下,数据馈送将是一个单进程/DB会话,因此使用MyISAM而不是InnoDB可能是一个更好的主意(我在您稍后的评论中看到,您说MyISAM有问题,可能是多个客户端的问题)。

您是同时阅读此日志,还是离线阅读?如果没有,您最好登录到一个文件,然后导入到您的RDBMS中?如果您确实需要日志立即进入RDBMS,是否需要强制ACID合规性?我们可以接受事件发生与数据库中的可用性之间的5分钟延迟。我想把事件记录到一个日志文件中的文件系统中,但我想我们会有很大的并发写入问题不是吗?除了使用RDBMS,还有其他处理并发性的方法:如果这是你唯一的动机,那就像用大锤敲开一个螺母一样。阅读查询的频率有多高?您必须维护哪些索引(如果有)?你需要强制ACID合规吗?@eggyal关于索引,我们有:#日期#id#事件/数据#id#事件/日期/数据#id#用户我们不需要ACID合规。阅读查询最多可能是每分钟1次。您能告诉我您使用的是什么操作系统,MySQL的数据文件存储在什么文件系统上吗?我倾向于建议您构建一个(线程安全的)应用程序,该应用程序写入RAM中的缓冲区,并在缓冲区满后刷新RDBMS。由于您不需要ACID遵从性,您可能会发现InnoDB正在生成您不需要的IO;也许另一个存储引擎,如MyISAM,更适合您?但我投票支持迁移到,因为他们会更好地了解如何为这个应用程序优化MySQL安装。