什么是最好/最快的MySQL表架构用于临时/循环存储,例如用于会话管理? [英] What is the best/fastest MySQL Table Schema for temporary/rotating storage, e.g. for session management?

查看:67
本文介绍了什么是最好/最快的MySQL表架构用于临时/循环存储,例如用于会话管理?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

为非常动态的网站编写自定义MySQL数据库驱动的PHP会话管理时,会话表的最佳(最快的读/写访问)结构是什么?

When it comes to writing custom MySQL database-driven PHP session management for a VERY dynamic website, what is the best (fastest read/write access) structure for your session table?

错误示例(未优化):


CREATE TABLE `session` (
    `session_id` VARCHAR(32) NOT NULL,
    `session_data` TEXT NOT NULL,
    `t_created` DATETIME NOT NULL,
    `t_updated` DATETIME NOT NULL,
    PRIMARY KEY  (`session_id`)
) ENGINE=INNODB DEFAULT CHARSET=utf8;

我认为使用内存引擎会更好/更快,但我不确定.我想不出用英语解释一切的好方法,所以我列出了我认为很重要的要求/细节:

I assume that using the Memory Engine would be better/faster, but I'm not sure. I can't think of a good way to explain everything in English, so I've made a list of requirements/details that I think are important:

详细信息:

  • 类别:优化
  • 子类别:MySQL查询性能
  • 目标:最快的随机访问表架构和单行查询
  • 常见用途:自定义会话管理,临时存储
  • 操作系统:* nix,更具体地说:Centos 5+(在x86_64上)
  • 数据库:MySQL版本:5+(社区版本)

结果:

  • SQL查询:创建表
  • SQL查询:通过随机键(例如,PHP会话ID)选择单行
  • SQL查询:使用随机键(例如,PHP会话ID)插入单行
  • SQL查询:通过随机键(例如会话ID)更新单行
  • SQL查询:按时间戳删除多行(垃圾回收,例如过期的会话)

预期的行寿命(例如会话时长):

Expected Row Lifespan (e.g. session durations):

  • 30%:0s-30s
  • 20%:30s-5m
  • 30%:5m-1h
  • 20%:1h-8h

预期的行数(例如活动会话):

Expected Row Count (e.g. active sessions):

  • 低:128
  • 中:1024
  • 最高:100000

如果任何人都可以想到一种更好的方式来表达所有这些短语,请随时进行编辑.

If anyone can think of a better way to phrase all this, please feel free to edit.

推荐答案

您的直觉似乎是正确的.我建议按如下方式创建表:

Your intuition seems to be about right. I'd recommend creating the table as follows:

CREATE TABLE session (
  id CHAR(32) NOT NULL,
  data BLOB NOT NULL,
  t_created TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
  t_updated TIMESTAMP,
  PRIMARY KEY (session_id),
  INDEX t_created(t_created),
  INDEX t_updated(t_updated)
)
ENGINE = MEMORY
CHARACTER SET utf8;

注意:

  • id-当您知道内容的长度时,CHAR会便宜一些
  • 数据-BLOB(二进制大对象)在这里更适用,因为您可能存储的不是TEXT.
  • t_created和t_updated-TIMESTAMP-计算速度更快,尽管您将时间范围限制在1901-2038,但这对于此应用程序来说应该没问题.
  • t_created和t_updated上的INDEX占用大量内存,并非​​完全必要,但在按这些列进行查询时,它们确实可以帮助提高性能.
  • MEMORY表虽然非常快,但却有其局限性.如果您的mysqld重新启动,则所有数据都将丢失.

旁注: 我不确定您打算如何垃圾收集会话,但是如果您希望50%的会话少于5分钟,则如何定义会话结束?用户/客户端是否必须明确退出会话(通过注销)?如果您隐式结束会话,那么用户访问网站的时间可能会很艰难.

Side note: I'm not sure how you plan to garbage-collect your sessions, but if you're expecting 50% of your sessions to be under 5 minutes, how is an end-of-session defined? Must a user/client explicitly end their session (via logging out)? If you implicitly end sessions that quickly, your users may have a very rough time with your website.

这篇关于什么是最好/最快的MySQL表架构用于临时/循环存储,例如用于会话管理?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆