【问题标题】:InnoDB or MyISAM for sessions?用于会话的 InnoDB 或 MyISAM?
【发布时间】:2013-11-10 08:01:55
【问题描述】:

我正在将 myisam 表用于我正在构建的网站,因为它将主要是只读的。这就是为什么我认为 myisam 会更好。但是我将用户会话存储在数据库中......这意味着在每个页面请求上选择 + 更新会话表。因此,对于会话,我现在在表上有 1/1 读/写,如果我需要在会话中更新某些内容,则写入可能会更高。我应该为这样的表使用 innodb 吗?还是 1/1 读/写比率仍然是 myisam 没有问题的东西?该应用程序不会有高流量(尽管我什至不确定是什么定义了这种情况下的高流量)

【问题讨论】:

  • 实际上我会说“两者都不是”:如果您担心性能,两者都太慢了。使用 MEMORY(引擎)或 Memcached/Redis(另一个具有内存存储的 RDBMS)。
  • 您想对内置 PHP 会话不支持的会话做什么?
  • @RandomSeed ... 将它们存储在数据库中。这不是关于会话的问题,而是关于存储引擎的问题。会话是最好的例子,但它们并不是唯一一个你会得到像 1/1 这样的比率的情况。所以我们不要在这里跑题。
  • 了解您的需求有助于提供与您的目的相关的建议。如果您只是想解决性能瓶颈,或者如果您想允许分布式会话,那么“最佳”存储引擎是不一样的。我的问题可能过于简洁和误导。
  • @RandomSeed 我想我的要求是应用程序每秒最多能够处理几十个用户。就会话而言,这个问题已经得到了很好的回答,但我有点想强调 1/1 读/写比率,而不是会话本身,因为与会话不同,在某些情况下不能使用与内存相关的解决方案,因为数据很重要,不应在服务器关闭时丢失。

标签: mysql innodb myisam


【解决方案1】:

就原始性能而言,MyISAM 通常比 InnoDB 快(主要是因为它不是 ACID)。因此访问 MyISAM 消耗的资源比 InnoDB 少

另一方面,MyISAM 只支持表级锁定:在高并发环境中,延迟会增加。不过,几十个简单的查询应该不会造成太大的麻烦(假设您的大部分查询都是简单的SELECT session_data FROM session_table WHERE session_id = <some_id>)。

相反,InnoDB 提供了更高的健壮性:InnoDB 表几乎不可能损坏,并且性能方面的差异越来越不显着(例如,参见this benchmark)。有些人甚至会争辩说现在没有理由继续使用 MyISAM(InnoDB 成为 v5.5 中的默认存储引擎)。

我很抱歉没有就哪个“更快”提供更明确的答案。与往常一样,在性能优化方面,必须进行实际测试。请记住,您可以非常轻松地切换引擎(ALTER TABLE t ENGINE=[MyISAM | InnoDB]),我建议您尝试看看。

但考虑到您的预期流量,使用其中一个应该不会产生太大的影响。

【讨论】:

  • 这很容易切换,但是像自动增量这样的一些东西在两个引擎中的工作方式不同。更不用说在 innodb 上的死锁检测了。至于“哪个更快”——我真的不在乎,只要一切都在几分之一秒内而不是整秒内运行。而且我担心 myisam 可能会因为过早的全表锁定而开始发生这种情况。无论如何,感谢您的意见,我认为您的最后一句话很好地回答了我的问题:)
  • 还有一件事要补充:MyISAM 可以优化,以防您执行大量删除/插入查询,并且可以轻松取回空间。虽然 InnoDB 没有优化并且表不断变大。减小其大小的唯一方法是重新制作索引文件。
【解决方案2】:

您有很多选择,但 Mysql 不是最好的:

  1. 如果您有硬件 Raid,则将其保存在光盘上是不错的选择,但不适合复制。
  2. Mysql - 是和否我以前使用过 Mysql - Myisam 和 50 个用户表崩溃。因此,如果您需要,可以使用“MEMORY (HEAP)" table
  3. 像 PHP+extension 这样的语言有自己的 Session storage eq WinCache Session Handler - 手动
  4. 最受欢迎Php+memcached session
  5. 您甚至可以将 Sqlite 用于 Session 存储,因为您可以。对我来说最好的选择是 Mongodb 会话存储 || REDIS-SESSION-PHP
  6. 有些人将序列化引擎更改为“igbinary”以获得更好的性能

【讨论】:

  • 来自CI manual: "Only MySQL and PostgreSQL databases are officially supported, due to lack of advisory locking mechanisms on other platforms."
猜你喜欢
  • 1970-01-01
  • 2011-09-21
  • 1970-01-01
  • 2011-04-24
  • 2016-01-05
  • 1970-01-01
  • 1970-01-01
  • 2011-05-14
  • 1970-01-01
相关资源
最近更新 更多