会话使用InnoDB还是MyISAM?

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

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

1

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

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

CI手册中得知:"仅官方支持MySQL和PostgreSQL数据库,因为其他平台缺乏咨询锁定机制。" - machineaddict

1

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

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

相反,InnoDB提供了更强的稳健性:一个InnoDB表几乎不可能损坏,并且在性能方面的差异越来越小(例如,请参见这个基准测试)。有些人甚至会认为,现在没有什么理由继续使用MyISAM(InnoDB成为v5.5的默认存储引擎)。

很抱歉我没有提供更明确的答案来回答哪个更“快”。当涉及到性能优化时,必须进行真实的测试。请记住您可以非常容易地切换引擎(ALTER TABLE t ENGINE=[MyISAM | InnoDB]),建议尝试并查看结果。
但是考虑到您预期的流量,使用其中一个引擎不应该有太大的差异。

转换很容易,但是一些东西,如自动增量在两个引擎中的工作方式不同。更不用说innodb上的死锁检测了。至于“哪一个更快” - 只要所有东西都在几秒钟内运行而不是整个秒数,我真的不在乎。而且我担心这可能会因为myisam的全表锁定太快而开始发生。无论如何,感谢您的意见,我认为您的最后一句话回答了我的问题 :) - Marius
还有一件事要补充:如果您执行许多删除/插入查询,则可以优化MyISAM,并且可以轻松地恢复空间。而InnoDB没有优化选项,表会不断增大。减少其大小的唯一方法是重新制作索引文件。 - machineaddict

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接