每次呈现网页时我都需要增加一个计数器。
当我使用mongodb执行此操作时,我可以在常规磁盘上的4核/ 8线程CPU上执行大约每秒16000次写入。
当我使用Mysql InnoDB表时,我只能做...常规磁盘上每秒30次写入或SSD上写入200次!!
因为每个事务只有一个写入(基本上我在为同一个http请求递增计数器后没有其他写操作) 将autocommit用于False并手动提交将无济于事。
不同之处在于Mongodb懒得写出来。
我尝试将Mysql缓冲写入,然后通过将这些参数设置为my.cf将它们刷新到磁盘,但它没有帮助:
innodb_buffer_pool_size = 1G
innodb_flush_method=O_DIRECT
innodb_log_file_size=100M
innodb_change_buffering=all
innodb_thread_concurrency=8
有没有办法让更快的mysql写入?
答案 0 :(得分:1)
如果您所做的只是“每次呈现网页时递增一个计数器”,那么我建议您完全抛弃数据库。将计数器完全保留在内存中(例如通过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
)。
答案 1 :(得分:0)
innodb_flush_log_at_trx_commit = 2
获胜者是:快150倍!!!在标准磁盘上(稍后将尝试使用SSD)