簡體   English   中英

什么是用於臨時/旋轉存儲的最佳/最快MySQL表架構,例如用於會話管理?

[英]What is the best/fastest MySQL Table Schema for temporary/rotating storage, e.g. for session management?

在為非常動態的網站編寫自定義MySQL數據庫驅動的PHP會話管理時,會話表的最佳(最快的讀/寫訪問)結構是什么?

錯誤示例(未優化):

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;

我假設使用內存引擎會更好/更快,但我不確定。 我想不出用英語解釋一切的好方法,所以我列出了一些我認為很重要的要求/細節:

細節:

  • 類別:優化
  • 子類別:MySQL查詢性能
  • 目標:最快的隨機訪問表模式和單行查詢
  • 常見用途:自定義會話管理,臨時存儲
  • 操作系統:* nix,更具體地說:Centos 5+(在x86_64上)
  • 數據庫:MySQL版本:5+(社區版)

成果:

  • SQL查詢:創建表
  • SQL查詢:按隨機鍵選擇單行(例如PHP會話ID)
  • SQL查詢:使用隨機鍵插入單行(例如,PHP會話ID)
  • SQL查詢:按隨機鍵更新單行(例如會話ID)
  • SQL查詢:按時間戳刪除多行(垃圾收集,例如過期的會話)

預期行壽命(例如會話持續時間):

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

預期行數(例如活動會話):

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

如果有人能想出更好的方式來表達這一切,請隨時編輯。

您是否考慮過使用memcachedAPC作為會話數據? 這幾乎肯定會比任何RDBMS解決方案快得多。

另一個建議是,如果您開始使用MySQL:而不是MEMORY存儲引擎,只需為各種緩存緩沖區啟用大量內存。 這樣,數據將是持久的,由磁盤存儲透明地支持,但在使用時可以快速獲得。

你的直覺似乎是正確的。 我建議按如下方式創建表:

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上的索引內存很昂貴,並非完全必要,但在查詢這些列時它們確實可以幫助提高性能。
  • MEMORY表雖然速度極快,卻有其局限性。 如果你的mysqld重新啟動,所有數據都會丟失。

旁注:我不確定您打算如何對會話進行垃圾收集,但如果您希望50%的會話時間不到5分鍾,那么會話結束如何定義? 用戶/客戶端必須明確結束會話(通過注銷)嗎? 如果您隱含地快速結束會話,您的用戶可能會在您的網站上度過非常艱難的時間。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM