我需要在每次呈现网页时递增一个计数器。
当我使用 mongodb 执行此操作时,我可以在普通磁盘上的 4 核/8 线程 CPU 上每秒执行大约 16000 次写入。
当我使用 Mysql InnoDB 表时,我只能...在普通磁盘上每秒写入 30 次或在 SSD 上每秒写入 200 次!!
因为每个事务我只有一次写入(基本上在为同一个 http 请求递增我的计数器后我没有其他写入要做) 使用自动提交为 False 并手动提交将无济于事。
不同之处在于 Mongodb 会延迟刷新写入。
通过将这些参数设置到 my.cf 中,我尝试让 Mysql 缓冲写入,然后将它们刷新到磁盘,但它没有帮助:
innodb_buffer_pool_size = 1G
innodb_flush_method=O_DIRECT
innodb_log_file_size=100M
innodb_change_buffering=all
innodb_thread_concurrency=8
有没有办法让 mysql 写入速度更快?
最佳答案
如果您所做的只是“每次呈现网页时增加一个计数器”,那么我建议您为此完全放弃数据库。将计数器完全保存在内存中(例如通过 memcached
),并使用 cronjob 每 10 分钟将其转储到磁盘以保持更永久的记录。
如果您记录的不仅仅是一个计数器并且想要使用数据库,请考虑使用 MySQL MEMORY
存储引擎 (https://dev.mysql.com/doc/refman/5.0/en/memory-storage-engine.html)。
CREATE TABLE t (i INT) ENGINE = MEMORY;
该表将保存在内存中,因此比基于磁盘的表快得多。如果您需要持久性,您只需要一个脚本来不时地手动“刷新”到磁盘(例如 mysqldump
)。
关于Mysql InnoDB 与 Mongodb 写入性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30897504/