InnoDB or MyISAM for sessions?
我正在将myisam表用于我正在构建的网站,因为它将主要是只读的。 这就是为什么我认为myisam会更好。 但我将用户会话存储在数据库中...这意味着对每个页面请求的会话表进行选择+更新。 因此,对于会话,我现在在表上有1/1读/写,如果我需要在会话上更新某些内容,那么写入可能会更高。 我应该用innodb这样的桌子吗? 或者1/1读/写比仍然是myisam没有问题的东西? 该应用程序将没有高流量(虽然我甚至不确定什么定义了这种情况下的高流量)
-
我实际上说"不":如果你担心表现,两者都太慢了。使用MEMORY(引擎)或Memcached / Redis(另一个具有内存存储的RDBMS)。
-
您想对内置PHP会话不支持的会话做什么?
-
@RandomSeed ...将它们存储在db中。这不是关于会话的问题,而是关于存储引擎的问题。会话就是最好的例子,但它们并不是唯一一个比率为1/1的情况。所以,我们不要在这里讨论主题。
-
了解您的要求有助于提供与您的目的相关的建议。如果您只是尝试解决性能瓶颈,或者您希望允许分布式会话,那么"最佳"存储引擎就不一样了。我的问题可能过于简洁和误导。
-
@RandomSeed我想我的要求是应用程序最多能够每秒处理几十个用户。就会话而言,问题已得到很好的回答,但我有点想强调1/1读/写比率而不是会话本身,因为与会话不同,在某些情况下,无法使用与内存相关的解决方案,因为数据很重要,不应该在服务器关闭时丢失。
在原始性能方面,MyISAM通常比InnoDB快(主要是因为它不是ACID)。因此,访问MyISAM比InnoDB消耗更少的资源。
另一方面,MyISAM仅支持表级锁定:在高度并发的环境中,延迟增加。然而,几十个简单查询不应该造成太多麻烦(假设您的大多数查询都是直截了当的SELECT session_data FROM session_table WHERE session_id = )。
相反,InnoDB提供了更强大的功能:InnoDB表几乎不可能被破坏,并且性能方面的差异往往变得越来越不重要(例如,看到这个基准)。有些人甚至认为现在没有理由继续使用MyISAM(InnoDB成为v5.5中的默认存储引擎)。
我很抱歉没有提供更明确的答案,哪个更"快"。与性能优化一样,必须进行实际测试。请记住,您可以非常轻松地切换引擎(ALTER TABLE t ENGINE=[MyISAM | InnoDB]),我建议您试试看。
但考虑到您的预期流量,使用其中一个或那个不应该产生太大的差异。
-
它很容易切换,但有些东西如自动增量在两个引擎中的工作方式都不同。 更不用说innodb上的死锁检测。 至于"哪一个更快" - 只要一切都在几秒钟而不是几秒钟内运行,我真的不在乎。 而且我担心可能会因myisam的问题而开始发生因为过快的全桌锁。 无论如何,感谢您的意见,我认为您的最后一句话很好地回答了我的问题:)
-
还有一件事要补充:MyISAM可以进行优化,以防你执行大量删除/插入查询,并且可以轻松地检索空间。 虽然InnoDB没有优化,但表格不断变大。 减小其大小的唯一方法是重制索引文件。
你有很多选择,Mysql不是最好的选择:
如果你有硬件Raid,那么在光盘上保存它的好选项,不适合复制。
Mysql - 是的,没有我以前使用Mysql - Myisam和50个用户表崩溃。因此,如果您需要,可以使用"MEMORY(HEAP)"表
像PHP +扩展这样的语言有自己的Session存储eq WinCache Session Handler - Manual
最受欢迎的Php + memcached会话
您甚至可以使用Sqlite进行会话存储,因为您可以。对我来说,最好的选择是Mongodb Session storage || Redis的-SESSION-PHP
有些人将序列化引擎更改为"igbinary"以获得更好的性能
-
从CI手册:"Only MySQL and PostgreSQL databases are officially supported, due to lack of advisory locking mechanisms on other platforms."