2010年9月27日

MySQLのVARCHARサイズについて

正確な最大長がわからないときの最小かつ十分なサイズの値ってどう決めるのが良いのだろうーと思ってつぶやいてみたところ、多くの方々に返信いただけました。ありがとうございます。
17
すぎゃーん💯 @sugyan

varchar(...) にどんな数字をいれておくのがいいのか悩む。「これくらいの範囲の長さがくると想定しているならこの値にしておけ」みたいな指標はあるのかしら。十分かつ最小の2のn乗の値にしておく、とか? #mysql

2010-09-27 22:48:36
すぎゃーん💯 @sugyan

255でも256でもパフォーマンス的に大きな違いはないと思うのだけど なんか「こういう理由でこっちを選ぶんだよ!」みたいのが欲しい。。

2010-09-27 22:55:41
Sig. @sigwyg

@sugyan てきとーに大きめな数字入れて、運用見て切るとか。

2010-09-27 22:57:27
SH2 @sh2nd

UTF-8で255か256かのところにオーバーフローページ利用有無の境目があります。 http://bit.ly/94z5BV RT @sugyan: 255でも256でもパフォーマンス的に大きな違いはないと思うのだけど なんか「こういう理由でこっちを選ぶんだよ!」みたいのが欲し

2010-09-27 22:57:38
SH2 @sh2nd

256と257の間かも>< RT @sh2nd: UTF-8で255か256かのところにオーバーフローページ利用有無の境目があります。 http://bit.ly/94z5BV RT @sugyan: 255でも256でもパフォーマンス的に大きな違いはないと思うのだけど...

2010-09-27 22:58:44
SH2 @sh2nd

そのへんにUNIQUE INDEXが作れるかどうかの境目もあります RT @sh2nd: 256と257の間かも>< RT @sh2nd: UTF-8で255か256かのところにオーバーフローページ利用有無の境目があります。 http://bit.ly/94z5BV RT...

2010-09-27 23:01:38
haruta makoto @haruta_makoto

@sugyan 複合インデックスを貼る時に長さが問題になる事があるので、少ない方が良い気がしますが。どうなんですかね。。。

2010-09-27 23:04:12
haruta makoto @haruta_makoto

@sugyan UTF8の256の長さとdatetimeカラムで複合ユニークにしようとしたらできませんでした

2010-09-27 23:05:47
Sig. @sigwyg

MySQL のデータ長って、ブロックサイズの等倍にすると良かったような。シーク回数とか分割時とか。ちょっといま手元に本がないけど(移動中

2010-09-27 23:09:47
Ryuta Kamizono @kamipo

@sugyan 256よりは255のほうがいいです。varcharはlengthを最初に保存していて255は1バイトですが256だと2バイト必要になってしまうので。

2010-09-27 23:11:11
haruta makoto @haruta_makoto

@sugyan あ、mysqでlの話です。あと、sort buffer あたりの使い方のあたりでもバイト数が関係するとききました。なので、考え得る最大?で少ない方がいいのかな。と。

2010-09-27 23:13:16
SH2 @sh2nd

UNIQUE INDEX張れるのVARCHAR(255)までだった

2010-09-27 23:14:51
すぎゃーん💯 @sugyan

@sh2nd ありがとうございます! 768byte目までとそれ以降が違う扱いになる、ということですかね…? そうすると255にしておくべき理由にはなりそうですね。

2010-09-27 23:16:06
すぎゃーん💯 @sugyan

@kamipo たしかに! そこの境目はありますね。ありがとうございます。 では100文字程度のものが入りそう、というときだとどういう値がいいですかね… 128とかでもなく、150とか200とかとっちゃうのがキリがいいでしょうか ><

2010-09-27 23:18:03
SH2 @sh2nd

そうです→「768byte目までとそれ以降が違う扱い」 RT @sugyan: @sh2nd ありがとうございます! 768byte目までとそれ以降が違う扱いになる、ということですかね…? そうすると255にしておくべき理由にはなりそうですね。

2010-09-27 23:22:22
すぎゃーん💯 @sugyan

@haruta_makoto ありがとうございます。少ないにこしたことはない、とは分かっているのですが、最大サイズが正確にはわからない、という場合にどういう値にしておくのがちょうどいいのか、という疑問でした。255と256という例はよくなかったかもしれません ><

2010-09-27 23:24:08
Ryuta Kamizono @kamipo

@sugyan 100文字程度のものが入りそう、ならとりあえず考えを保留する意味で僕は255にしておきますが、基本的には何文字まで許可するのか決めて、その値にすると思います!

2010-09-27 23:24:55
すぎゃーん💯 @sugyan

255と256では諸処の理由から255にしておくべきだと納得しました。 僕が最初に思った疑問は「20〜50文字くらいだと思うけどもうちょっと長くなるかも。でも100文字にはならない」というくらいの微妙な想定のときにみなさんどうするんだろう?ということでした ><

2010-09-27 23:27:24
haruta makoto @haruta_makoto

@sugyan あー、なるほど。どうなんでしょう。自分は32,64,255で適当に決めてしまいます。

2010-09-27 23:29:55
のりぃ @m_norii

自分は悩むの面倒なので、一律255、それ以上になりそうならtext型にしてます。でも根拠レスなので、有識者の見解が知りたい。ちなみにInnoDB。 RT: @sugyan: varchar(...) にどんな数字をいれておくのがいいのか悩む。 #mysql

2010-09-27 23:30:06
SH2 @sh2nd

@sugyan Twitterのタイムライン格納するとき、私はVARCHAR(140)で作りましたが @sakaik さんがVARCHAR(255)で作ってました。とりあえず悩んだら全部255にするという方針は一つあると思います

2010-09-27 23:36:07
すぎゃーん💯 @sugyan

想定最大長に応じて 20 / 50 / 100 / 255 くらいの数字をつかってみようと思います!

2010-09-27 23:46:05

コメント

すぎゃーん💯 @sugyan 2010年9月27日
勝手に自分的な結論をだしました。
0
すぎゃーん💯 @sugyan 2010年9月28日
@matsubokkuri コメントありがとうございます。ストレージの食い方同じなのですか?リンク先みても分かりません。。 インデックス貼る際や検索の際に速度やメモリ使用量に差が出そうな気がして10文字程度のものに対しても255とかはどうなんだろうとか思ってしまいます ><
0
SH2 @sh2nd 2010年9月28日
VARCHARは可変長ですから、VARCHAR(255)に10文字入れた場合とVARCHAR(50)に10文字いれた場合で使用されるストレージ容量は同じですよ。基本的には、実際に何文字入れるかが問題になります。
0
SH2 @sh2nd 2010年9月28日
あと、ここに書いてあることはすべてInnoDBが前提です。
0
すぎゃーん💯 @sugyan 2010年9月28日
@sh2nd コメントありがとうございます! たしかにストレージエンジンに関して何も記述していませんでした。InnoDB前提ですね。 「ストレージの食い方」というところは誤解釈していたようです…つまり、例えば10文字程度しか入らないカラムに対してもVARCHAR(255)にしておいて損することはない、ということですよね?ストレージ容量的には。 メモリ使用量的には最小限に抑えておいたほうが良いようですが…
0
SH2 @sh2nd 2010年9月28日
ストレージ容量はそうです。メモリもサーバ側は大差ないと思いますが、クライアント側がいちいちchar[768]とか確保してしまう処理系なのかどうかは確認したほうが良いかもしれませんね。
0
すぎゃーん💯 @sugyan 2010年9月28日
なるほどー。ありがとうございます ><
0
すぎゃーん💯 @sugyan 2010年9月29日
はい、理解しました! ありがとうございます!!
0
sigeharucom(💉💉) @sigeharucom 2018年2月21日
自分も後からutf8mb4にしようとしてちょっと困ったことがあった→ https://qiita.com/jkr_2255/items/74fc79e764378b59355a 「MySQLのインデックス長は767バイトまで」 「1文字4バイトのutf8mb4では『『『191文字』』』が限界」
1