1
0
テーマ、知りたいこと
MySQL で真偽値を格納するカラムを設定することはままあるかと思いますが、そのカラム型はどうされていらっしゃいますか?
調べると下記のような、BIT(1)
派とBOOLEAN
派に分かれそうです。
背景、状況
こちらはBIT(1)
派の方のご意見の記事です。
MySQLに真偽値を格納する場合はbit(1)型のフィールドが最適
https://qiita.com/ka215/items/379c4d46d0c04b7fdb46
こちらはBOOLEAN
派の方のご意見(ご回答)です。
Bit vs. Boolean columns
https://dba.stackexchange.com/questions/15801/bit-vs-boolean-columns
私としては、「BIT(1)
は格納される値が2つしかない点で優れているが、SELECT
時に1(0)
をtrue(false)
に変換しないといけない手間がかかる点が扱いにくい」と感じており、甲乙つけがたく悩んでいます。
特に求めているご意見
「私が取り組んだケースではこちらの方がこういう点で良かった・悪かった」など具体ケースでのご意見ですと特に嬉しく思います。
よろしくお願い致します。
試したこと
尚、下記SQLで50万行ほどのレコードに対し確認したところ実行計画は同じ結果になり、優位性はこの件数と方法では見られないようでした。
SQL
1-- テストテーブル 2CREATE TABLE booltest ( 3 id INT UNSIGNED NOT NULL AUTO_INCREMENT, 4 bit1 BIT(1) NOT NULL, 5 tis TINYINT NOT NULL, 6 tiu TINYINT UNSIGNED NOT NULL, 7 bol BOOLEAN NOT NULL, 8 PRIMARY KEY (id), 9 INDEX (bit1), 10 INDEX (tis), 11 INDEX (tiu), 12 INDEX (bol) 13);
SQL
1-- 各パターンをINSERT 2INSERT INTO booltest (bit1, tis, tiu, bol) VALUES (0,0,0,0); -- 1行 3INSERT INTO booltest (bit1, tis, tiu, bol) VALUES (0,0,0,1); 4INSERT INTO booltest (bit1, tis, tiu, bol) VALUES (0,0,1,0); 5INSERT INTO booltest (bit1, tis, tiu, bol) VALUES (0,0,1,1); 6INSERT INTO booltest (bit1, tis, tiu, bol) VALUES (0,1,0,0); 7INSERT INTO booltest (bit1, tis, tiu, bol) VALUES (0,1,0,1); 8INSERT INTO booltest (bit1, tis, tiu, bol) VALUES (0,1,1,0); 9INSERT INTO booltest (bit1, tis, tiu, bol) VALUES (0,1,1,1); 10INSERT INTO booltest (bit1, tis, tiu, bol) VALUES (1,0,0,0); 11INSERT INTO booltest (bit1, tis, tiu, bol) VALUES (1,0,0,1); 12INSERT INTO booltest (bit1, tis, tiu, bol) VALUES (1,0,1,0); 13INSERT INTO booltest (bit1, tis, tiu, bol) VALUES (1,0,1,1); 14INSERT INTO booltest (bit1, tis, tiu, bol) VALUES (1,1,0,0); 15INSERT INTO booltest (bit1, tis, tiu, bol) VALUES (1,1,0,1); 16INSERT INTO booltest (bit1, tis, tiu, bol) VALUES (1,1,1,0); 17INSERT INTO booltest (bit1, tis, tiu, bol) VALUES (1,1,1,1); -- 16行 18 19-- 倍々に増やす 20INSERT INTO booltest (bit1, tis, tiu, bol) SELECT bit1, tis, tiu, bol FROM booltest; -- 32行 21INSERT INTO booltest (bit1, tis, tiu, bol) SELECT bit1, tis, tiu, bol FROM booltest; -- 64行 22INSERT INTO booltest (bit1, tis, tiu, bol) SELECT bit1, tis, tiu, bol FROM booltest; 23INSERT INTO booltest (bit1, tis, tiu, bol) SELECT bit1, tis, tiu, bol FROM booltest; 24INSERT INTO booltest (bit1, tis, tiu, bol) SELECT bit1, tis, tiu, bol FROM booltest; 25INSERT INTO booltest (bit1, tis, tiu, bol) SELECT bit1, tis, tiu, bol FROM booltest; 26INSERT INTO booltest (bit1, tis, tiu, bol) SELECT bit1, tis, tiu, bol FROM booltest; 27INSERT INTO booltest (bit1, tis, tiu, bol) SELECT bit1, tis, tiu, bol FROM booltest; 28INSERT INTO booltest (bit1, tis, tiu, bol) SELECT bit1, tis, tiu, bol FROM booltest; 29INSERT INTO booltest (bit1, tis, tiu, bol) SELECT bit1, tis, tiu, bol FROM booltest; -- 16384行 30INSERT INTO booltest (bit1, tis, tiu, bol) SELECT bit1, tis, tiu, bol FROM booltest; 31INSERT INTO booltest (bit1, tis, tiu, bol) SELECT bit1, tis, tiu, bol FROM booltest; 32INSERT INTO booltest (bit1, tis, tiu, bol) SELECT bit1, tis, tiu, bol FROM booltest; 33INSERT INTO booltest (bit1, tis, tiu, bol) SELECT bit1, tis, tiu, bol FROM booltest; 34INSERT INTO booltest (bit1, tis, tiu, bol) SELECT bit1, tis, tiu, bol FROM booltest; -- 524228行
SQL
1-- BIT(1) に対する実行計画を確認 2EXPLAIN SELECT * FROM booltest WHERE bit1 = 1; 3EXPLAIN SELECT * FROM booltest WHERE bit1 = true; 4 5-- BOOLEAN に対する実行計画を確認 6EXPLAIN SELECT * FROM booltest WHERE bol = 1; 7EXPLAIN SELECT * FROM booltest WHERE bol = true;
回答20件
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。