mysql - 处理 10K 插入和频繁选择操作的数据库服务器设置

标签 mysql postgresql database-design

目前我有一个系统(服务器)一次从 1000 个设备(客户端)接收消息,每个设备每分钟发送一次消息。

每条消息将有超过 2000 条记录。

因此每分钟系统将接收 1000 X 2000 => 2,000,000 条记录

同时我期待频繁的选择请求(大约 1000 个)

查询是

设置数据库服务器 (Mysql/postgres) 以处理这种频繁的批量插入和读取操作的最佳方法是什么?

最佳答案

所以我只是将 1M 假行(一个字符和一个从 1 到 1000000 的整数)批量化,并将其插入笔记本电脑上 postgresql 的一个事务中。花了4秒。一分钟 100 万次插入很容易,至少一开始是这样。然而,还有很多事情需要担心。例如,更新索引可能很昂贵。我在整数字段上添加了一个唯一索引,插入时间从 4 秒变成了 9 秒。插入另外 1M 行需要 14 秒。随着指数的增长,这个数字将继续攀升。一旦索引不再适合内存,它将飙升。

通常,处理这么多数据的最佳方法是将其填充到离散的文本文件中,然后在没有索引的情况下在以后批量上传。然后添加索引。

Ollie 在他关于 MySQL 的回答中提到的所有内容也适用于大多数其他数据库。

PostgreSQL 特定的东西:

使用连接池和持久连接,保持较低的总连接数,比如低于 100。

使用 FAST 存储介质。您在这里遇到的问题是您可能需要大量存储空间,因此 SSD 可能无法工作。如果你必须使用旋转驱动器,那么将它们中的很多放在 RAID Controller 下,并在 RAID-10 中使用电池支持的硬件缓存以获得最佳性能和良好的可靠性。 RAID-5 或 6 在这里将是一场灾难,因为它们的写入性能非常糟糕。

尽可能多地将写入批处理在一起。与某些会在大型事务上呕吐的数据库不同,PostgreSQL 非常适合在一个事务中一次处理 1M 或更多行。

根据需要使用尽可能少的索引。

关于mysql - 处理 10K 插入和频繁选择操作的数据库服务器设置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14528906/

相关文章:

postgresql - 从 sql 格式转储恢复 pythonanywhere 上的 postgresql

C# 编程 : Maintaining a List that Associates an ID with Information Quickly

database-design - 如何将不同类型的属性值存储为EAV?

java - 在具有潜在多语言需求的数据库中定义 "types"的最佳实践设计模式?

php - 解释一个显示销量最高的 3 辆汽车的 MySQLi 查询

mysql - 简化mysql递归查询

mysql - 在大表中使用用户 ID 作为主键

mysql - 将存储为行的名称值对转换为列

postgresql - spring boot + hibernate 5 + java 8 + ZonedDateTime = ImplicitNamingStrategy 异常

postgresql - 将 search_path 恢复为 postgresql 中的默认值