当前位置: 首页 > 面试题库 >

用于临时/循环存储(例如用于会话管理)的最佳/最快的MySQL表架构是什么?

赫连淳
2023-03-14
问题内容

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

错误的例子(未优化):

创建表`session`(
    session_id VARCHAR(32)非空,
    `session_data` TEXT NOT NULL,
    `t_created` DATETIME NOT NULL,
    `t_updated` DATETIME NOT NULL,
    主键(`session_id`)
)ENGINE = INNODB DEFAULT CHARSET = utf8;

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

细节:

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

结果:

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

预期行寿命(例如会话持续时间):

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

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

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

如果有人想出一种更好的方式来表达所有这些短语,请随时进行编辑。


问题答案:

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

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。
  • 尽管您限于时间范围1901-2038,但t_created和t_updated-TIMESTAMP-的计算速度更快,但是对于此应用程序来说应该没问题。
  • t_createdt_updated上的INDEX占用大量内存,并非​​完全必要,但在按这些列进行查询时,它们确实可以帮助提高性能。
  • MEMORY表虽然非常快,但却有其局限性。如果您的mysqld重新启动,则所有数据都将丢失。

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



 类似资料:
  • 问题内容: 我正在使用maven和Jenkins进行自动构建。我正在寻找最佳的Maven开源存储库管理。这样我就可以通过存储库管理器在Maven和jenkins之间进行整合。 问题答案: 我至少知道三个选择 sonatype products archiva.apache(Apache Archiva) 我已经使用了所有三个,每个都有优点和缺点。 我会选择Nexus,因为它得到了Sonatype的

  • 问题内容: 我一直在寻找用于在MongoDB中存储会话数据以在使用Express的生产应用程序中使用的最佳中间件。 我一直在四处寻找,发现了这一点: session-mongoose (https://github.com/donpark/session-mongoose)根据作者的评论,由于以下原因,该产品尚未投入生产: connect-mongo (https://github.com/kcb

  • 问题内容: 我正在接管以前的开发人员的一些应用程序。当我通过Eclipse运行应用程序时,我看到内存使用率和堆大小增加了很多。经过进一步调查,我发现他们正在循环创建一个对象以及其他东西。 我开始经历并做一些清理。但是,我经历的时间越长,我就会遇到更多的问题,例如“这实际上会做什么?” 例如,他们没有在上述循环之外声明变量,而只是在循环中设置其值…而是在循环中创建了对象。我的意思是: 与 我不正确地

  • 问题内容: 基本上,我的问题是- 我有一个价格清单,其中一些是历史价格(即,我希望能够搜索到产品X在3月11日价格为0.99美元,在4月1日价格为1.99美元,等等)。存储此信息的最佳方法是什么? 我以为我可能会有一个产品表,该产品表具有一个价格表的外键。最初,我认为存储当前价格可能是最好的选择,但是我想我希望能够存储历史价格数据,所以最好的方法是存储一个类似于以下价格表的表: 我在这里有点茫然。

  • 问题内容: 我在做一个简单的文本处理和打印语句时经常遇到这种情况,其中我遍历一个集合,我想对最后一个元素进行特殊情况处理(例如,除最后一种情况外,每个普通元素都将用逗号分隔)。 是否有一些最佳实践习惯用法或优雅的形式,不需要重复代码或在循环中插入if或else。 例如,我有一个要用逗号分隔的列表打印的字符串列表。(“做而做”解决方案已经假定该列表包含2个或更多元素,否则与条件循环更正确一样)。 例

  • 问题内容: 就性能,稳定性,成熟度等而言,用于HTTP POST,GET等的最佳Java库是什么?有没有一个特定的库比其他库使用得更多? 我的要求是将HTTPSPOST请求提交到远程服务器。我过去使用过java.net。包以及org.apache.commons.httpclient。包。两者都完成了工作,但是我想请您提出一些意见/建议。 问题答案: imho:Apache HTTP客户端 用法示