什么是高插入负载的最佳 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 表格式?的主要内容,如果未能解决你的问题,请参考以下文章