Php MySQL会话表方法

Php MySQL会话表方法,php,mysql,memory,session,innodb,Php,Mysql,Memory,Session,Innodb,我正在使用LAMP开发一个多租户web应用程序。我的所有用户会话数据当前都存储在mysql中,表类型为InnoDB 是否有任何方法可以使用内存(以前是堆)表类型存储当前会话,并使用会话处理程序的垃圾收集器函数在InnoDB(常规表)和内存表(in)之间移动会话 当我需要集群和主从配置时,这种配置会以任何方式影响吗 在以后的阶段 提前感谢,, ocptime编写一个表非常简单,但我认为存储会话数据的方法可能比存储内存表更好 类似这样的模式(通过从中的更改提升) 然后,您只需定义会话处理程序函数,如

我正在使用LAMP开发一个多租户web应用程序。我的所有用户会话数据当前都存储在mysql中,表类型为InnoDB

是否有任何方法可以使用内存(以前是堆)表类型存储当前会话,并使用会话处理程序的垃圾收集器函数在InnoDB(常规表)和内存表(in)之间移动会话

当我需要集群和主从配置时,这种配置会以任何方式影响吗 在以后的阶段

提前感谢,, ocptime

编写一个表非常简单,但我认为存储会话数据的方法可能比存储
内存
表更好

类似这样的模式(通过从中的更改提升)

然后,您只需定义会话处理程序函数,如上面的链接或本文中所述。如果您想在垃圾收集期间保存会话信息,只需使用
INNODB
引擎创建一个与上面相同的表,并在
gc()
函数的末尾添加一位,该函数将行从
内存复制到
INNODB

然而,
内存
表有一些相当大的限制。他们不能使用
BLOB
TEXT
列——这就是为什么我在上面有丑陋的
varchar(20000)
。它们的最大大小为16MB。如果你有很多用户,保持很多状态,或者垃圾收集有问题,你可以达到这个极限并崩溃

更好的方法是使用,特别是如果您不需要将会话信息存储到遥远的将来。我非常确定
memcached
比任何RDBMS都要快(即使使用
内存
表),而且它在设计上可以很好地扩展。另外,您不必编写自己的会话处理程序函数

InnoDB: ~40 milliseconds Cons: (Slowest)
MEMORY: ~22 milliseconds Cons: (16MB Max)
MyISAM: ~25 milliseconds Cons: (Table-level locking)

我使用的是(gs),所以我不能使用memcache,但那将是最好的

我个人在考虑使用内存,但我不知道性能优势是否会超过大小限制等成本。因此,我做了每个优秀程序员在优化时应该做的事情:我分析了它

我讨论中的php页面缓存在smarty中,因此这里发生的唯一操作是在url上进行正则表达式查找和sql会话抓取,以检查用户是否登录

总之,结果如下:使用InnoDB,我等待请求的时间大约为40毫秒。(我用开发工具在chrome上测量了这一点。)将表切换到内存后,我得到了每个请求约20毫秒的时间。哇!提高50%!但是等等。。。MyISAM呢?我试过了,每次请求都有22-23毫秒。哦

这只是我在测试它,不是一个完整的应用程序。一个真正的应用程序每秒会有数千人向该表写入数据,而MyISAM会执行表级锁定,这可能很糟糕()


所以,我现在坚持回忆。对于那些缓存的页面来说,这是一个巨大的改进,但我鼓励您进行评测!如果您的网站正在重建每个页面,那么10毫秒可能并不重要。

使用InnoDB表进行会话。我听说内存表在插入时会锁定整个表,而InnoDB只锁定需要操作的特定行。

可以通过调整系统变量来增加最大表大小。表级锁定如何影响更大规模应用程序的性能。当有人试图像登录一样写入会话时,它会有效阻止用户吗?@Lightbulb1,每个页面视图都必须更新数据库上的会话表,以更新上次访问的时间(以了解会话何时过期以及会话何时可以自由进行垃圾收集)。如果两个人同时获得一个页面,那么一个人必须等到另一个人的写操作完成,因为Mysql会阻塞直到写操作完成(除非您进行更新,这样可以解决问题)。不过,这些都只是过早的优化。如果你的站点很忙,考虑MycChan.谢谢你提供的信息。我以前没有使用过memcache,所以我需要对它做更多的研究。这将是未来的解决方案。
InnoDB: ~40 milliseconds Cons: (Slowest)
MEMORY: ~22 milliseconds Cons: (16MB Max)
MyISAM: ~25 milliseconds Cons: (Table-level locking)