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

标签 mysql

我正在为系统添加新功能。该过程将从 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_insertMyISAM可以将插入的行追加到末尾,同时仍然从另一个 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/

相关文章:

php - 使用 PDO 对数组进行分页上限

phpseclib - 将 mysql 查询解析为数组

php - 从数据库中的单个单元格获取多个数据

android - 减去 R 中数据框中的列。 A-B=已校正 A。这些是传感器中从数据帧 B 寻求校正的抽象值

mysql - 棘手的 CTE - 递归 sql(编辑我的查询)

python - 使用 django 和 sqlalchemy 但后端 mysql

php - 在 PHP 中搜索 MySQL 数据库

mysql - 查找MySQL中同一列中两个值之间的差异

php - 每次在 Laravel 中更改状态时发送 Slack 通知

php - CI 模型中的 where_not_in 代码