每秒插入超过100个查询时应使用哪个引擎?
问题的原因是需要处理每秒超过100个插入查询。解决方法有多种:
1. 使用MyISAM引擎:如果操作的主要场景是大量插入操作,MyISAM是一个更快的选择。但是,根据数据使用情况的不同,这个答案可能会有很大的变化。如果这是一个存档应用程序,可以考虑使用ARCHIVE存储引擎。它最适合于只写一次,很少读取的应用。
2. 调查INSERT DELAYED:它允许客户端程序发出插入命令后立即返回,而不需要等待插入完成。不过,这会在mysqld进程中消耗内存。如果这种操作方式符合您的需求,那么这是选择MyISAM引擎的一个有力原因。
3. 注意目标表中的索引:维护索引是服务器插入工作负载的重要组成部分。
4. 查看MariaDB:它是MySQL的兼容分支,具有一些更高级的存储引擎和功能。
根据类似应用程序的经验,我们采取了两个方法来解决这个问题:
1. 使用消息队列系统:只运行几个进程来执行实际的插入操作。原始客户端将其日志记录写入消息队列,而不是直接写入数据库。(Amazon AWS的SQS是这样一种消息队列系统的例子)。
2. 重新设计插入过程:使用LOAD DATA INFILE一次性加载大量的日志行。
通过采取这些措施,我们的应用程序的工作负载逐渐增加,服务器可以跟得上。请注意,这种工作负载在廉价的共享托管服务或AWS微实例上是不可行的。
问题:选择哪种引擎来处理每秒超过100个插入查询的情况
原因:简单的一行插入代码在任何引擎中的性能是有限的,特别是在InnoDB引擎中,最多只能达到每秒大约100行。然而,我们可以通过一些调整来提高性能,例如设置innodb_flush_log_at_trx_commit参数为2,将innodb_buffer_pool_size设置为可用内存的70%。
解决方法:
1. 如果用户同时向同一张表插入多行数据,可以使用LOAD DATA或者批量插入(INSERT ... VALUES (...), (...), ...)来实现更快的插入速度。
2. 不要过度依赖MyISAM引擎,因为它的性能并不是InnoDB的10倍甚至100倍。在当前版本的MySQL中,很难找到一个经过良好调整的应用程序在MyISAM引擎下比InnoDB引擎更快。而且,MyISAM在发生崩溃时可能会出现数据损坏,而InnoDB则不会。
3. 使用ARCHIVE引擎可以节省磁盘空间,但会增加CPU的负担。使用MEMORY引擎可能更快,因为它没有I/O操作,但是考虑到数据量的大小,这个引擎可能不适用。
4. 如果每秒插入100行数据,相当于每天8百万行,每年30亿行。是否会定期清理数据?是否会对数据进行查询?如果需要清理数据,可以考虑使用分区表来提高性能;如果需要查询数据,可以考虑使用汇总表来加速查询。
5. 在创建索引时,尽量减少索引的数量。如果你有一个"随机"索引,比如UUID,并且有10亿行数据,无论使用哪种引擎,无论做任何调整,每秒只能插入100行数据。是否需要进一步解释呢?
6. 如果这是一个队列系统,建议直接执行任务,而不是排队等待。
建议使用InnoDB引擎,并进行适当的调整。使用批量插入,避免创建过多的索引等。