【问题标题】:Mysql MEMORY table vs InnoDB table (many inserts, few reads)Mysql MEMORY 表 vs InnoDB 表(插入多,读取少)
【发布时间】:2012-02-11 10:01:24
【问题描述】:

我在 InnoDB 表上运行我的网站,到目前为止运行良好。现在我想知道我的网站上实时发生了什么,所以我将每个页面浏览量(页面、引荐来源、IP、主机名等)存储在 InnoDB 表中。每秒大约有 100 次插入,当我浏览日志时,这个表只会偶尔读取一次。

我每分钟使用一个删除旧项目的 cron 清理表。这会在该表中平均留下大约 35.000 行,大小约为 5MB。

如果我将 InnoDB 表转移到 MEMORY 表,在服务器上会更容易吗?据我所知,这会节省很多磁盘 IO 对吗?重启 Mysql 会导致数据丢失,但在我的情况下这无关紧要。

问题:就我而言,你会推荐一个内存表而不是 InnoDB 表吗?

【问题讨论】:

    标签: mysql optimization innodb


    【解决方案1】:

    是的,我愿意。您提到的条件(大量写入、定期清除数据、不需要数据持久性)使其非常适合 MEMORY。

    【讨论】:

    • 我已经切换到 MEMORY 表,性能还不错。我确实注意到我的锁定等待率现在有点糟糕。当前锁定等待比率 = 1 : 570 是 Tuning-primer 所说的。对此我能做些什么?
    • 我相信长宽比是一个服务器范围的指标,所以你应该在另一个问题中问它。也可能在 serverfault.com 而不是 SO。
    • 好的,谢谢,我已经在这里问过了:serverfault.com/questions/350364/high-lock-wait-ratio-in-mysql
    【解决方案2】:

    请优化您的 innodb 设置:

    只要您已将 InnoDB 配置为使用足够的内存来保存整个表(使用 innodb_buffer_pool_size),并且同一服务器上的其他 InnoDB 表没有过多的压力,数据将保留在内存中。如果您担心写入性能(并且再次禁止使用同一系统的其他用途),您可以通过设置 innodb_flush_log_at_trx_commit = 0 并禁用二进制日志记录来降低持久性以显着提高写入性能。

    对临时表使用任何类型的触发器都将是一团糟,并且不会给您带来临时表事务性的任何好处。

    您可以在此处找到更多详细信息: http://dev.mysql.com/doc/refman/4.1/en/innodb-parameters.html#sysvar_innodb_flush_log_at_trx_commit

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-03
      • 1970-01-01
      • 2012-05-15
      • 2011-10-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多