• ベストアンサー

mySQLのカラムの並び順によるデータ領域確保について

mySQLのカラムの並び順によるデータ領域確保について http://d.hatena.ne.jp/yarb/20090519/p2 のような4バイト単位で領域を確保するのでしょうか? 同じテーブルでも並び順は、4バイト単位を意識して、 パターン1で作成した方が効率は良いのでしょうか? ■パターン1 tinyint(1) tinyint(1) tinyint(1) char(1) int int int ■パターン2 tinyint(1) int tinyint(1) int char(1) int tinyint(1)

質問者が選んだベストアンサー

  • ベストアンサー
  • MeijiK
  • ベストアンサー率100% (3/3)
回答No.1

ここらへんは、適切なデータ型や適切なキャラクタセットを選択すること以外は、 気にするほどの効果は得られないと思います。 どうしても気になるような場合や、効果を確認したい場合には、 実際にデータを入れてみて確認することをおすすめします。実際にデータを入れるには ご自分の得意なプログラミング言語で挿入してもいいですが、MySQL 5.0以降では ストアドプロシジャが利用できるので、これを使うとプラットフォームに依存せず MySQL本体だけで、どのくらいデータ領域が利用できるか確認できます。例えば 以下のようなテーブルとストアドプロシジャを作成して、 create table tbl1( t1 tinyint(1), t2 tinyint(1), t3 tinyint(1), c4 char(1), i5 int, i6 int, i7 int) engine = myisam; delimiter $ create procedure tbl1_insert(v_max int) begin declare v_id int default 0; repeat set v_id = v_id + 1; insert into tbl1 values(mod(v_id, 128),mod(v_id, 128),mod(v_id, 128),'a', v_id, v_id, v_id); until v_id > v_max end repeat; end; $ delimiter ; create table tbl2( t1 tinyint(1), i2 int, t3 tinyint(1), i4 int, c5 char(1), i6 int, t7 tinyint(1)) engine = myisam; delimiter $ create procedure tbl2_insert(v_max int) begin declare v_id int default 0; repeat set v_id = v_id + 1; insert into tbl2 values(mod(v_id, 128),v_id, mod(v_id, 128),v_id, 'b', v_id, mod(v_id, 128)); until v_id > v_max end repeat; end; $ delimiter ; 以下のように実行すると、それぞれ10万行が挿入できます。 mysql> call tbl2_insert(100000); mysql> call tbl1_insert(100000); その後実際にできたデータファイル(MyISAMの場合、*.MYD)を確認すると 今回の場合は、差異がないことが確認できます。 2010/07/22 09:54 8,712 tbl1.frm 2010/07/22 09:56 1,700,017 tbl1.MYD 2010/07/22 10:05 1,024 tbl1.MYI 2010/07/22 09:54 8,712 tbl2.frm 2010/07/22 09:55 1,700,017 tbl2.MYD 2010/07/22 10:05 1,024 tbl2.MYI

すると、全ての回答が全文表示されます。

関連するQ&A