我正在为系统添加新功能。该过程将从 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表。
最佳答案
Should I use MyISAM or InnoDB table format?
对于频繁并发读写的项目,应该使用InnoDB
。
Does MyISAM lock the entire table while doing inserts, thus blocking the select statements from the web interface?
启用@@concurrent_insert
,MyISAM
可以将插入的行追加到末尾,同时仍然从另一个 session 并发读取。
但是,如果您除了 INSERT
以外的任何地方,这可能会失败(即表将锁定)。
The system needs to be able to insert 1000-2000 records every second.
将这些插入批量化,分批进行会更好。
InnoDB
在每秒行数方面比在每秒事务数方面快得多。
The data table will keep the last 24 hours of data, older data is deleted from the table.
请注意,InnoDB
会锁定所有检查的行,而不仅仅是那些受影响的行。
如果您的 DELETE
语句将使用全扫描,则并发 INSERTs
将失败(因为全扫描将使 InnoDB
放置间隙锁定浏览的所有记录,包括最后一条)。
关于mysql - 高插入负载的最佳 mysql 表格式是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1587954/