InnoDBのレコード構造 ExtraDataについて
昨日の件をWikiにまとめようとしているところなんですがね.実は困ったことが1つありまして.
- http://dev.mysql.com/doc/refman/4.1/en/innodb-restrictions.html
- http://dev.mysql.com/doc/refman/5.0/en/innodb-restrictions.html
- http://dev.mysql.com/doc/refman/5.1/en/innodb-restrictions.html
- http://dev.mysql.com/doc/refman/4.1/ja/innodb-restrictions.html
- http://linux.ouc.edu.cn/manual/APM/innodb/en/index.html#InnoDB_restrictions
つまりこれらのマニュアルの説明の,InnoDBのPageサイズからくる行サイズの制限につての記述が,バージョンにより異なる,言語によって異なる,ということなんですわ.
英語版の4.1/5.0/5.1では768バイトまでは普通にRecordと一緒に格納されて,そこから先はExtraDataとして処理されると書いてある.デフォルト16KBのPageに対してRecordは約8000バイトと書いてある.
で,昨日のMyNAでの話はMySQL 4.0.21が前提だったのだけれども,4.0向け公式マニュアルというのは今は無いのでいろいろ漁ってみた所見つかったこれ,
http://linux.ouc.edu.cn/manual/APM/innodb/en/index.html#InnoDB_restrictions
を見ると,先頭512バイトがRecordと一緒に格納されると書いてある.
ちなみに日本語版4.1マニュアルでは,「InnoDB は、サイズが 128 バイト以下のフィールドを個別のページに格納しない。」と書いてある.しかもこの日本語4.1マニュアルにおいてだけ「キーの最大長は 7,000 バイトである。」と他と違うことが書いてある.128ってのも若しかしたら別の話をしていて間違いではないのかもしれないけれども,これはさておき7000バイトであるというのはどういうことよ.正確に言うと8059バイトなんだけどな.英語版はこれを約8000といっているわけよ.
要するにまず日本語マニュアルが信用ならないってことが1つ,それと4.0限定の公式英語マニュアルが無いのでドキュメントだけでは自分的に確証が持てないというのが問題なのだ.
実際にmysql-4.0.21で検証クエリを実行してみた結果,512バイトまではRecordと一緒にPageに格納している振る舞いをしていたので,MyNAのMLにはあのように書いたわけだけど.
で,要望が1つ.できればこれについてもう少ししっかりした裏を取りたい.ソースから読み取れればそれが分かりやすい証拠になるわけだけど.
ん,これは一体何? innobase/include/rem0rec.h
/* The data size of record must be smaller than this because we reserve two upmost bits in a two byte offset for special purposes */ #define REC_MAX_DATA_SIZE (16 * 1024)
いやーな予感.Pageサイズを64KBにしても16KBまでしかレコードは入らないということでせうか?
うがー.やっぱり入りませんでした orz
MyNA MLに追加メール発射.
。。。。
さて気を取り直して続行w mysqlクライアントを使った検証ではMySQL 5.1にて768バイトまでがRecordに入るってのは確認した.いやだねー.
しかしね,MySQL4.0にバンドルしていたInnoDBでは512バイトだったものをMySQL4.1以降にバンドルしているInnoDBでは768バイトに代わったりだとか,16KBレコードサイズ制限(14バイトのオフセットで管理しているため)だとか,なんでこの辺りの数値を選択しているのか,という理由がまったく今の僕には理解できません.もっと賢くなりたい今日この頃.