【发布时间】:2012-09-09 01:40:13
【问题描述】:
我想使用 MySQL 来存储会话变量。据我了解,这意味着在每个页面请求上都会对表进行一次读取和一次写入。
哪种 MySQL 存储引擎最适合这项任务? MyISAM、InnoDB、MariaDB(我在 PHPMyAdmin 中没有看到)、Memory 或其他什么?
【问题讨论】:
标签: php mysql session storage-engines
我想使用 MySQL 来存储会话变量。据我了解,这意味着在每个页面请求上都会对表进行一次读取和一次写入。
哪种 MySQL 存储引擎最适合这项任务? MyISAM、InnoDB、MariaDB(我在 PHPMyAdmin 中没有看到)、Memory 或其他什么?
【问题讨论】:
标签: php mysql session storage-engines
“最佳”没有任何意义。你需要表达你的约束:你需要一致性吗?耐用性?高可用性?表现?所有这些属性的组合?你能负担得起放松你的会话吗?它们能适应记忆吗?是否需要支持对同一数据的并发访问?
如果没有更多上下文,我会选择最平衡的存储引擎 InnoDB。它为 OLTP 应用程序、ACID 事务、良好的可靠性和明智的并发管理提供了正确的性能。会话变量的访问可能会使用主键来完成,而这个操作对于 InnoDB 来说非常有效。
现在,如果性能确实是一个限制因素,我宁愿使用 NoSQL 引擎(即不是 MySQL)。对于存储会话数据,Redis 通常做得很好,并且很容易集成和部署。
【讨论】:
内存存储引擎听起来是最好的选择。请记住,这适用于临时会话。
http://dev.mysql.com/doc/refman/5.0/en/memory-storage-engine.html
【讨论】:
这取决于你如何评价“更好”:
MyISAM 是最常见的(许多共享主机包只允许您使用 MyISAM)。加上它在关系控制方面相当有限,所以你设置它非常快速和容易。如果您想要跨多个托管场景的可移植性和快速实施,MYISAM 是最好的。
InnoDB 允许您通过链接不同表中的键来创建关系并保存数据完整性,这意味着更多的工作,但更专业的数据库设计。许多共享主机包没有实现 InnoDB,因此在将表结构从一个环境导出到另一个环境时,您可能需要做一些额外的工作。如果你想要关系管理和控制,INNODB 是最好的。
就数据可移植性而言,MyISAM 将完全接受 InnoDB 数据库(因为 MyISAM 不检查数据完整性:“当我在 user_car 中插入新记录时,用户数据库中是否存在用户号 4,对于例子”)。如果您从 MyISAM 开始,导出到成熟的 InnoDB 数据库将是一场噩梦,即使您的数据具有所有键,表数据也必须以正确的顺序导入(用户和汽车,在 user_car 之前)。
玛丽亚数据库?永远不会,仅仅因为使用它的人少,因此与 MyISAM 和 InnoDB 相比,您将获得更少的支持。
底线敲门砖:INNODB。
【讨论】:
如果您不希望 SQL 连接产生开销,请考虑使用 MemCached 会话存储。见http://php.net/manual/en/memcached.sessions.php
【讨论】: