質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

Q&A

解決済

3回答

7172閲覧

MySQLで速度を優先して数値を使うか?わかりやすさを優先して文字列を使うか?

St.

総合スコア12

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

1グッド

1クリップ

投稿2020/06/22 10:35

shirts1とshirts2という2つのテーブルがあり、御覧の通りsizeカラムの型が異なります。
3種類しかないのでマスタテーブルを作るほどでもないと思っていまが、下記いずれの型でsizeカラムを設定したらいいのか決められません。

SQL

1# shirt1 2CREATE TABLE shirts1 ( 3 name VARCHAR(40), 4 size INT(1) # 1=small, 2=medium, 3=large を意味する 5); 6 7# shirt2 8CREATE TABLE shirts2 ( 9 name VARCHAR(40), 10 size ENUM('small', 'medium', 'large') 11);

INSERTとSELECTは次のようになります。
shirts1はやはり WHERE size = 2 という数値指定で済むので速度が速いと思うのですが、逆にshirts2は WHERE size = 'medium' という文字列指定でわかりやすい面があります。

あとはshirts2のENUMならば値を制限できるメリットもありますが、フロントから入力される値ではないためあまり大きなメリットではないと言えそうです。

sql

1# shirt1 2INSERT INTO shirts1 (name, size) 3VALUES ('dress shirt',1), ('t-shirt',2), ('polo shirt',3); 4SELECT name, size FROM shirts1 WHERE size = 2; 5 6# shirts2 7INSERT INTO shirts2 (name, size) 8VALUES ('dress shirt','small'), ('t-shirt','medium'), ('polo shirt','large'); 9SELECT name, size FROM shirts2 WHERE size = 'medium';

ここでどちらにすべきか決めかねてしまい、識者の皆様からアドバイスを頂きたく思っています。

このように数個しかなくマスタテーブルを作るほどでもない種類について、速度を優先して数値型にすべきか?それともわかりやすさを優先してENUMの文字列型にすべきか?

皆様いかが思われますでしょうか。

draq👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

ベストアンサー

ENUMは文字列指定でわかりやすい面と数値指定で速度が速い面の両方を併せ持つ仕組みとなっています。
内部的には数値化されて保存されており、検索時には数値で処理し、SQLの入力時と結果の出力時に文字列と数値を読み替える実装となっています。
ご質問の内容であれば、ENUMで問題ないように思います。

投稿2020/06/22 11:21

etsuhisa

総合スコア416

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

St.

2020/06/22 11:36

ありがとうございます。dev.mysql.com をよく読んだら仰る様にちゃんと書いてありました。 あともしですが、例えばもし以下kakaku2テーブルでもsizeカラムを使い、かつ「small、medium、large」などの名前が将来変更されるかもしれない…という場合でしたら、ENUMはこのように名前の変更には対応していませんから、ENUMでなく普通にマスタテーブルを作るのがいいですよね? # kakaku2 CREATE TABLE kakaku2 ( shirts_ID, jpy VARCHAR(5), usd VARCHAR(5), size ENUM('small', 'medium', 'large') ); INSERT INTO kakaku2 (jpy, usd, size) VALUES ('1000','10','small'), ('2000','20','medium'), ('3000','30','large'); SELECT s.name, s.size, k.jpy FROM shirts2 s LEFT JOIN kakaku2 k ON k.size = s.size WHERE s.size = 'medium';
St.

2020/06/22 11:49

いやそれとも、「small」を「s」などに変更する場合であってもENUMは有用で、 size ENUM('small', 'medium', 'large')を size ENUM('s', 'medium', 'large')にすれば、 それ以前のINSERT結果もマスタテーブル同様に変わってくれるのでしょうか? このあたり載ってなくてよく分かりませんね。
etsuhisa

2020/06/22 11:55

自分では経験がなく適切な説明ができませんが、以下のようにすることで文字列を置き換えられるようです。 1) ALTER TABLEでENUMに新しい文字列を追加する ALTER TABLE ~ ENUM('small','midium','large','SMALL','MIDIUM','LARGE'); 2) UPDATEでENUMの古い文字列を新しい文字列に更新する UPDATE ~ SET size='SMALL' WHERE size='small'; : 3) ALTER TABLEでENUMから古い文字列を取り除く ALTER TABLE ~ ENUM('SMALL','MIDIUM','LARGE'); #すみません、上記のキーワードで検索せいてみてください...
St.

2020/06/22 11:59

ご丁寧に方法までありがとうございます。マスタテーブルのカラムを一つ変えるよりは手間ですが、その程度ならば問題ない作業ですね。
guest

0

数値か文字列かの速度の違いはほとんど無視して良いです。コードの見易さとしては大切ですが。

速度を気にするのは、MySQL データベースが遅いときの調査方法と高速化テクニック をしっかり学習できると良いです。それで飯が喰えます。

投稿2020/06/22 10:51

Orlofsky

総合スコア16417

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

St.

2020/06/22 11:29

大きな差があるものと思っていました。リンクありがとうございます。
guest

0

スピードはさほどかわらないでしょう
気にするならintではなくtinyint
結局1,2,3をsmall,medium,largeに読み替えているのはただの正規化

投稿2020/06/22 10:45

yambejp

総合スコア116724

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

St.

2020/06/22 11:29

たしかにtinyintの方がいいですね。ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問