l'essentiel est invisible pour les yeux

Tuesday, March 14, 2006

セッションをMySQLのオンメモリストレージに載せるための考察

MySQL5.0.3からVARCHARのMAXが65535byteまで増えたという情報を入手。

http://dev.mysql.com/doc/refman/5.0/en/char.html
http://dev.mysql.com/doc/refman/5.0/en/news-5-0-3.html

この二つの記事中の以下の情報をマージすると・・・

MEMORY (HEAP) can have VARCHAR() fields.
The length can be specified as a value from 0 to 255 before MySQL 5.0.3, and 0 to 65,535 in 5.0.3 and later versions.


HEAPエンジンでは、VARCHARが使えるようになりましたよ。
んでもって、MySQL5.0.3からVARCHAR型は、最大65,535byteまで格納できますよと。

で、実際に次のようなクエリを発行。

CREATE TABLE sessions_heap (`id` int(11) DEFAULT NULL auto_increment PRIMARY KEY, `session_id` varchar(255), `data` varchar(65500), `updated_at` datetime)engine=heap;

ERROR 1163 (42000): The used table type doesn't support BLOB/TEXT columns


さてさて、雲行きが怪しくなってきました。
同じクエリをengine=MyISAMとかにすればクエリは問題なく実行できます。
どうやらVARCHARのMAX以外の制限に依存していそうです。

で次は、VARCHARのサイズを減らして実行。

CREATE TABLE sessions_heap (`id` int(11) DEFAULT NULL auto_increment PRIMARY KEY, `session_id` varchar(255), `data` varchar(20000), `updated_at` datetime)engine=heap;

Query OK, 0 rows affected (0.01 sec)


どうやら、VARCHARは確かにサポートしている様子。
65500だとTEXT/BLOB型だと見なされてエラーになる。

そこで、VARCHARの限界値を探ってみた。

CREATE TABLE sessions_heap (`id` int(11) DEFAULT NULL auto_increment PRIMARY KEY, `session_id` varchar(255), `data` varchar(21800), `updated_at` datetime)engine=heap;

ERROR 1118 (42000): Row size too large. The maximum row size for the used table type, not counting BLOBs, is 65535. You have to change some columns to TEXT or BLOBs


先程と結果が変わった。
なるほど。HEAPエンジンの一行あたりのサイズの制限に引っ掛かった様子。もういちど、

http://dev.mysql.com/doc/refman/5.0/en/char.html
もう一度読み返してみることに。

The length can be specified as a value from 0 to 255 before MySQL 5.0.3, and 0 to 65,535 in 5.0.3 and later versions. (The maximum effective length of a VARCHAR in MySQL 5.0.3 and later is determined by the maximum row size and the character set used. The maximum length overall is 65,532 bytes.)


あ~あ。完全に読み飛ばしていた。
VARCHARの制限の前に、一行あたりの最大サイズの制限に引っ掛かる様子。HEAPエンジンは内部では、BTREEインデクスやHASHと同じ形なので制限が厳しい様子。

ちなみに、VARCHAR(21000)なら問題なく実行できる。
21000byte -> 21k
セッションデータ入れるには、ちょい厳しいか・・。

そしてtmpfsの話も少しだけ。
これもスレーブ上のMyISAMのテーブルを設置する以外は使い道がなさそう。セッションテーブルをtmpfsで運用するためには、障害時のことを考えて何かしら対策を打っておかないとデータが逝ってしまう。

セッションテーブルのレプリケーション先は、InnoDB on ext3にしておいてディスクに残すとかかな。

なかなかうまくいかない。。