MySQLでHEAP

携帯サイト作ってるとセッションとか使う場合、クッキー未対応機種が多々あるため、普通にセッションが使えません。

って事でURLの後ろにセッションIDつけて引き回したりするのです。

ついでにバランシング構成時にも通常のセッションが使えません。

データ生成されるサーバがそれぞれ異なる可能性があるので。

って事でDBセッション

session_set_save_handler関数使えばいいんですが、複数のセッションを管理したい場合に向いてないこともあるので自前のセッションクラスを使ってます。

で、タイトルのHEAP

上記自前のセッションクラスは値を格納する際に配列のまま保存するためにserializeして格納しています。

HEAPのテーブルは、各カラム毎にchar255以上のデータが保存できません。
TEXT型とか指定しても怒られるので辞めましょう。

セッションに格納するデータサイズを見極めて(最大数を決めておく)

それ以上にならないようにしましょう。

で、255バイト以下でセッションなんていらんやん とかなるので一工夫します

セッションテーブルにデータ格納領域をCHAR(255)×○個用意する。

たとえば以下のような感じ

CREATE TABLE `session_heap` (
  `ses_id int(11) NOT NULL,
  `ses_data1` varchar(255) DEFAULT NULL,
  `ses_data2` varchar(255) DEFAULT NULL,
  `ses_data3` varchar(255) DEFAULT NULL,
  `ses_data4` varchar(255) DEFAULT NULL,
  `ses_data5` varchar(255) DEFAULT NULL,
  `ses_data6` varchar(255) DEFAULT NULL,
  `ses_data7` varchar(255) DEFAULT NULL,
  `ses_data8` varchar(255) DEFAULT NULL,
  `ses_data9` varchar(255) DEFAULT NULL,
  `ses_data10` varchar(255) DEFAULT NULL,
  `ses_data11` varchar(255) DEFAULT NULL,
  `ses_data12` varchar(255) DEFAULT NULL,
  `ses_data13` varchar(255) DEFAULT NULL,
  `ses_data14` varchar(255) DEFAULT NULL,
  `ses_data15` varchar(255) DEFAULT NULL,
  `ses_data16` varchar(255) DEFAULT NULL,
  `ses_data17` varchar(255) DEFAULT NULL,
  `ses_data18` varchar(255) DEFAULT NULL,
  `ses_data19` varchar(255) DEFAULT NULL,
  `ses_data20` varchar(255) DEFAULT NULL,
  `ses_data21` varchar(255) DEFAULT NULL,
  `ses_data22` varchar(255) DEFAULT NULL,
  `ses_data23` varchar(255) DEFAULT NULL,
  `ses_data24` varchar(255) DEFAULT NULL,
  `ses_data25` varchar(255) DEFAULT NULL,
  `ses_data26` varchar(255) DEFAULT NULL,
  `ses_data27` varchar(255) DEFAULT NULL,
  `ses_data28` varchar(255) DEFAULT NULL,
  `ses_data29` varchar(255) DEFAULT NULL,
  `ses_data30` varchar(255) DEFAULT NULL,
  `last_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (`ses_id`)
) ENGINE=MEMORY DEFAULT CHARSET=utf8 MAX_ROWS=100000

これで255×30のセッション領域を確保

後はクラスの中でデータを書き込む際に255以下に分割して格納してやる。

読み出す際はクラスの中で結合して返す。

これをクラスの内部ですればセッションクラスを使う際には気にしなくて良くなる。

分割、結合のコストは確かにあるが、それよりもHEAPにすることのメリットの方が大きいのでたいしたオーバーヘッドにはならない  はず

後はメモリの許す限り領域を確保しましょう。上記は約1.5Gぐらいメモリ食います。10万件まで取るので。

GCは各自実行してください。 ほっとくと食い尽くすので注意。