什么是高插入负载的最佳 mysql 表格式?

Posted

技术标签:

【中文标题】什么是高插入负载的最佳 mysql 表格式?【英文标题】:What is the best mysql table format for high insert load? 【发布时间】:2009-10-19 10:29:28 【问题描述】:

我正在向系统添加新功能。该过程将从 PLC 读取实时数据并将其存储在数据库中。 数据表将有 4 列:variable_id (SMALLINT)、timestamp (TIMESTAMP)、value(FLOAT)、quality(TINYINT)。 主键是(variable_id,timestamp)。

系统需要能够每秒插入 1000-2000 条记录。

数据表将保留最近 24 小时的数据,旧数据从表中删除。

数据表还需要每秒处理 5-10 个 select 语句。 select 语句从表中选择特定变量的最新值并将其显示在网络上。

我应该使用 MyISAM 还是 InnoDB 表格式? MyISAM 在进行插入时是否会锁定整个表,从而阻止来自 Web 界面的 select 语句? 目前数据库中所有的数据表都是MyISAM表。

【问题讨论】:

【参考方案1】:

我应该使用 MyISAM 还是 InnoDB 表格式?

对于任何频繁并发读写的项目,你应该使用InnoDB

MyISAM 在进行插入时是否会锁定整个表,从而阻止来自 Web 界面的 select 语句?

启用@@concurrent_insert 后,MyISAM 可以将插入的行追加到末尾,同时仍从另一个会话并发读取。

但是,如果您不使用 INSERT,这可能会失败(即表将锁定)。

系统需要能够每秒插入 1000-2000 条记录。

最好将这些插入批处理并分批进行。

InnoDB 每秒行数比每秒事务数快得多。

数据表将保留最近 24 小时的数据,旧数据从表中删除。

请注意,InnoDB 会锁定所有检查的行,而不仅仅是那些受影响的行。

如果您的 DELETE 语句将使用全扫描,并发的 INSERTs 将失败(因为全扫描将使 InnoDB 将间隙锁放置在所有浏览过的记录上,包括最后一条记录)。

【讨论】:

【参考方案2】:

MyISAM 速度更快,它会锁定整个表。 InnoDB 是基于事务的,所以它会进行行锁定,但速度较慢。

【讨论】:

FWIW,我从 InnoDB 获得了出色的性能,但 MyISAM 快得多。他们侥幸逃脱,因为他们禁用了 InnoDB 所做的许多检查。 感谢您的回答。使用 MyISAM 插入记录时,表是否为 select 语句锁定?例如,如果插入语句需要 5 秒才能完成(只是一个随机数),那么 select 语句是否必须等待 5 秒才能返回结果? 我认为 Quassnoi 回答了这个问题 - 请检查有关 @@concurrent_insert 的信息。

以上是关于什么是高插入负载的最佳 mysql 表格式?的主要内容,如果未能解决你的问题,请参考以下文章

管理联结表的最佳方法是啥? (删除并插入)

负载均衡服务器的文件上传最佳解决方案

第一次将数据从其他来源插入应用程序表的最佳方法是啥?

如何为MySQL查询优化选择最佳索引

什么是用于临时/旋转存储的最佳/最快 MySQL 表模式,例如会话管理?

从 .CSV 文件比较/插入/更新 MySQL 数据库中的产品的最佳方法是啥