Ne iyi / geçici / dönen depolama için hızlı MySQL Tablo şeması, eg

2 Cevap php

Bir çok dinamik bir web sitesi için özel MySQL veritabanı odaklı PHP oturum yönetimi yazılı gelince, ne oturumu tablo için en iyi (hızlı okuma / yazma erişimi) yapısı nedir?

Kötü Örnek (Optimized değil):

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;

Ben Bellek Motorunu kullanarak daha iyi / daha hızlı olacağını varsayıyorum, ama emin değilim. Ben İngilizce şeyi açıklamak için iyi bir yol düşünemiyorum, ben önemli olduğunu düşünüyorum gereksinimleri / detayların bir listesini yaptık:

Detaylar:

  • Kategori: Optimizasyon
  • Alt Kategori: MySQL Sorgusu Performans
  • Hedef: En Random Access Tablo Şema ve Tek Sıra Sorgulama
  • Ortak Kullanım Alanları: Özel Oturum Yönetimi, Geçici Depolama
  • İşletim Sistemi: * nix, daha spesifik: Centos 5 + (x86_64)
  • Veritabanı: MySQL Versiyon: 5 + (Topluluk Version)

Sonuçlar:

  • SQL Sorgu: Tablo oluşturma
  • SQL Sorgu: Random Key Single Row seçin (örneğin PHP session id)
  • SQL Sorgu: Rastgele Key ile takın Tek Sıra (örneğin PHP session id)
  • SQL Sorgu: Random Key Update Tek Sıra (örneğin session id)
  • SQL Query: Damgasıyla tarafından Birden Satır Sil (çöp toplama, örneğin oturumları doldu)

Beklenen Satır ömrü (örneğin oturum süreleri):

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

Satır Sayısı (örn., aktif oturumlar) Beklenen:

  • Düşük: 128
  • Orta: 1.024
  • Yüksek: 100000

Herkes ifade tüm bu iyi bir yol düşünmek durumunda, düzenlemek için çekinmeyin.

2 Cevap

Sizin sezgi konusunda haklı gibi görünüyor. Ben aşağıdaki gibi tablo oluştururken tavsiye ederim:

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;

Notlar:

  • id - Eğer içeriğin uzunluğunu biliyorum DAMGA daha pahalı
  • veri - muhtemelen METİN başka bir şey saklıyorsanız olarak BLOB (Binary Large Object), burada daha uygulanabilir.
  • t_created ve t_updated - DAMGASI - Eğer zaman aralığı 1901-2038 sınırlı konum rağmen hesaplamalar, daha hızlı ama bu uygulama için iyi olmalıdır.
  • T_created ve t_updated üzerinde indeksler bellek pahalı ve tamamen gerekli değildir, ancak bu sütun tarafından sorgularken onlar gerçekten performans yardımcı olabilir.
  • BELLEK tablolar, inanılmaz hızlı iken, kendi sınırlamaları vardır. Lütfen mysqld relaunches, tüm veriler kaybolur.

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.

Eğer kullanımı olarak kabul memcached veya APC oturum verisi için mi? Bunlar hemen hemen kesinlikle herhangi bir RDBMS çözüm çok daha hızlı olacaktır.

Başka bir öneri MySQL kullanarak ayarlanır ise: yerine BELLEK depolama motoru, sadece çeşitli önbellek tampon bellek bol sağlar. Kullanımda olduğunda bu şekilde verilerin hızlı, dayanıklı, şeffaf disk depolama ile desteklenen, ancak mevcut olacaktır.