![快速数据库可存储 10 亿条记录](https://linux22.com/image/591591/%E5%BF%AB%E9%80%9F%E6%95%B0%E6%8D%AE%E5%BA%93%E5%8F%AF%E5%AD%98%E5%82%A8%2010%20%E4%BA%BF%E6%9D%A1%E8%AE%B0%E5%BD%95.png)
我正在编写代码来存储数据,并希望存储 10 亿到 100 亿甚至更多的记录。最重要的是速度(每秒接近 10000 - 20000 条记录)、空间使用率和防崩溃。现在我一直在使用 MySQL 的 MyISAM,它运行速度非常快,符合我们所需的速度。MyISAM 还具有最佳的空间使用率,MySQL 数据文件夹中的数据库文件几乎等于我插入的数据量,例如,对于每条 30 个字符的 100000 条记录,它只占用 3 MB。但唯一的问题是它不是 ACID,并且在崩溃时会导致数据丢失。
所以我想知道有任何替代方案(我甚至不介意将数据库软件更改为其他任何东西)可以帮助我们存储如此多的数据并快速存储它们。
我已经尝试过 MySQL INNODB,它的插入速度非常慢。我每秒只能达到 800 - 1000 条记录。此外,在 INNODB 中存储数据的空间量相当大。存储相同的 100000 条记录(每条 30 个字符)需要近 8 MB。
我也尝试了 MongoDB 作为替代方案,但它同样需要太多空间来存储相同的数据。
即使是 SQLITE3 DB,写入 100000 条记录的速度也非常非常慢。我尝试在 PHP 的 for 循环中执行此操作。它也遗漏了大约 20 条记录,并给出了数据库不可用的错误。
所以我想知道有什么开源数据库软件可以满足我的要求。我听说 MariaDBs ARIA 符合 ACID 标准。这是真的吗?或者 PostgreSQL 也是一个很好的快速选项,具有最佳的空间利用率。
我愿意接受任何快速、充分利用空间且防撞的解决方案。期待回复。
=== MariaDB Aria 更新 === 在插入速度和空间方面,它甚至比 InnoDB 更差。插入相同数据所花的时间是 InnoDB 的 1.5 倍,所用空间是 MyISAM 的近 2.5 倍。
答案1
这不是任何人都能在 5 分钟内 100% 搞定的事情,但如果你想达到这种级别的性能和功能始终如一那么我强烈怀疑你将不得不花钱。
如果您有足够的预算,那么我会考虑结合使用 Oracle 的“TimesTen”引擎,可能还会结合使用企业级 SSD 或 PCIe Flash(例如 FusionIO),如果您要走那么远,我建议您使用 Intel 的 Xeon E7-xxxx 系列,因为它们具有出色的 RRAS 功能,可以在发生故障时尽可能长时间地保持服务器正常运行。
答案2
如果获得更多功能和更好的性能只是使用不同的软件的问题,那么每个人都会这样做(至少是仍然在 IT 领域工作的少数人会这样做;)
如果您需要 ACID 支持 - 那么为什么要尝试 mongoDB?
使用 innodb 完全有可能获得所需的吞吐量(但 myisam 更快)——只要您在硬件上投入足够多并适当调整系统即可。但是您的首要限制是尽量减少空间使用,这意味着您没有预算去购买 SSD RAID 组。
可能导致崩溃时数据丢失
我曾见过 Oracle 和 Sybase 崩溃时数据丢失的情况 - 但理论上,这些系统应该更具弹性。我通常会花一些时间、精力和金钱来避免崩溃(专用服务器,使用质量合理的硬件、UPS、稳定的软件)。
甚至 SQLITE3 DB 也非常非常慢
SQLite 对底层文件系统特别敏感(但这会影响所有数据库)。你没有提到它运行在哪个文件系统上(甚至哪个操作系统!)这让我认为你没有花很多时间来调整安装。
如果是我的话我会看看玛拉雅数据库- 它是 mysql 的一个分支,包含一个改进的 ISAM 引擎(咏叹调) 它具有一些性能优势并且支持事务。(在 Linux 上运行,使用带有 nobarriers 的 xfs 和截止期限调度程序)。
但您需要查看硬件才能真正让它飞起来。
答案3
根据我的经验,InnoDB(如果配置和使用正确)只比 MyISAM 慢一点(当然不是一个数量级)。我想到了一些提高性能的建议:
- 您应该使用最新版本的 MySQL InnoDB 存储引擎。
- 您应该使用较大的缓冲池大小(~80%可用RAM)和较大的日志文件大小。
- 您应该使用事务和批量插入来获得高吞吐量。批量大小是一个重要的性能因素(不能太小,也不能太大)。
- 您应该使用 AUTOINCREMENT id 作为 PRIMARY KEY。任何索引都会降低插入速度,尤其是 UNIQUE。
- 您应该使用适合您的最低事务隔离级别。
- 调整你的系统的 innodb_flush_method。
- 如果您不需要完整的 ACID 保证,请考虑更改 innodb_flush_logs_at_trx_commit 的值
- 使用合适的硬件,调整操作系统/存储/文件系统
您会在这里找到很好的指点:
答案4
一个非常非常快的数据库:内存SQL