MySQL Oturum Tablo Yaklaşım

3 Cevap php

Ben LAMP kullanarak bir çok kiracı web uygulama geliştiriyorum. Bütün kullanıcı oturum verileri şu tablo türü InnoDB ile mysql saklanır.

Ben BELLEK kullanabilirsiniz herhangi bir yolu var mı geçerli oturumlarını saklamak ve InnoDB (normal tablo) ve (in) BELLEK tablo arasındaki oturumları taşımak için oturum işleyici çöp toplayıcı işlevi kullanmak için masa tipi (HEAP olarak kullanılan)?

Also will this configuration affects in any way when i want clustering & master-slave configuration at a later stage?

Thanks in Advance, ocptime

3 Cevap

Yazma custom session handler şaşırtıcı derecede kolaydır, ama ben MEMORY tabloları daha oturum verilerini saklamak için muhtemelen daha iyi yollar olduğunu düşünüyorum.

(a previous question değişikliklerle kaldırdı) gibi bir şema şey

CREATE TABLE IF NOT EXISTS `session` (
  `id` char(32) NOT NULL,
  `data` varchar(20000) NOT NULL,
  `time_created` timestamp NOT NULL default '0000-00-00 00:00:00',
  `time_updated` timestamp NOT NULL default '0000-00-00 00:00:00' on update CURRENT_TIMESTAMP,
  PRIMARY KEY  (`id`),
  KEY `time_created` (`time_created`),
  KEY `time_updated` (`time_updated`)
) ENGINE=MEMORY DEFAULT CHARSET=utf8;

o zaman sadece bu tutorial Yukarıdaki veya bağlantı belirtildiği gibi, oturum işleyici işlevleri tanımlamak gerekiyor. Eğer çöp toplama sırasında oturumu bilgi kurtarmak istedim sadece INNODB motoru kullanarak ve gc() sonunda biraz eklemek yukarıda birine özdeş bir tablo oluşturmak gerekir fonksiyon bu kopyalar INNODB tabloları MEMORY gelen satır.

Ancak MEMORY masaları bazı oldukça önemli sınırları var vardır. Onlar BLOB veya TEXT sütunları kullanamazsınız - O çirkin varchar(20000) yukarıda olması bu yüzden. Onlar 16 MB maksimum boyutu var. Kullanıcıların bir sürü varsa, devletin bir sürü tutmak, ya da bu sınırı ve kaza vurmak çöp toplama ile ilgili sorunlar var.

Daha iyi bir fikir memcache oturum işleyicisi , especially if you don't need to store session info into the distant future. I'm pretty sure memcached herhangi bir RDBMS olacağını daha hızlıdır (hatta MEMORY tablolar) ile kullanmak için ve tasarımı ile de ölçekler. Ayrıca kendi oturum işleyici işlevlerini yazmak zorunda kalmazsınız.

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

I (gs) kullanıyorum, bu yüzden ben memcache yapamam, ama bu iyi olurdu.

Ben şahsen BELLEK kullanarak düşündüğünü, ancak performans yararı vb boyutu sınırları maliyeti outway Yani optimize ederken her iyi programcı yapmanız gerekeni yaptım eğer ben bilmiyordum: Ben bunu profilli.

Söz Benim php sayfa smarty önbelleğe, böylece Buradaki tek işlemleri url üzerinde bir regex arama ve kullanıcı oturum olup olmadığını kontrol etmek için bir sql oturum kapmak olmasıdır

Neyse burada sonuçları: InnoDB ile I ~ bir isteği bekleyen 40 milisaniye başlamıştı. (Ben geliştirici araçları ile krom bu ölçülür.) I ~ istek başına 20 milisaniye var BELLEK tablo geçtikten sonra. vay! % 50 gelişme! Ama ne MyISAM hakkında bekleyin ...? Ben denedim ve ben ~ istek başına 22-23 milisaniye var. Oh.

Bu sadece bana bir tam ölçekli uygulama, değil test ediyor. Gerçek bir uygulama, her saniye bu tabloya yazma binlerce insan olurdu, ve MyISAM kötü olabilir tablo düzeyinde kilitleme yapar (Which MySQL database engine is better for storing sessions and session data: MyISAM or InnoDB?).

Yani şimdi, bellek yapışmasını ediyorum. Bu, bu önbelleğe alınmış sayfaları için büyük bir gelişme var, ama ben size profil teşvik! Web sitenizin her sayfayı yeniden ise, 10 milisaniye gerçekten önemli olmayabilir.

Oturumu için InnoDB tabloyu kullanın. Kilitleri tüm tablo eklerken ben bu bellek masa duymuş InnoDB kilitleri manipüle gereken sadece belirli satır ederken.