MySQL SETベンチマーク

MySQLの配列型について調査した。
見た目、カンマ区切りデータでありLike文による検索も行えるため
varchar型のLike文とも比較調査してみた。

結果、SET型でFIND_IN_SET関数使った検索は内部で最適化されていた。
ただSET方は64種類までの値しか管理できないため実務的に使えるのは限られる。


CREATE TABLE tbl1
(
id int primary key,
name varchar(10),
sex ENUM('male','female'),
lng SET('1','2','3','4','5','6','7','8','9','10','11','12','13','14','15','16',
'17','18','19','20','21','22','23','24','25','26','27','28','29','30','31','32',
'33','34','35','36','37','38','39','40','41','42','43','44','45','46','47','48',
'49','50','51','52','53','54','55','56','57','58','59','60','61','62','63','64')
);


insert into tbl1 values(1,'a','male','44,32,52,27,22,36,46,56,40,14');
insert into tbl1 values(2,'a','male','2,17,31,37,33,6,28,19,41,57');
insert into tbl1 values(3,'a','male','17,50,62,55,61,54,45,53,16,61');
insert into tbl1 values(4,'a','male','33,55,58,48,59,14,35,9,49,63');
insert into tbl1 values(5,'a','male','42,59,49,22,30,52,32,32,26,40');
insert into tbl1 values(6,'a','male','7,10,57,47,8,35,36,23,42,55');
insert into tbl1 values(7,'a','male','35,53,33,31,30,16,30,30,10,7');
insert into tbl1 values(8,'a','male','53,56,54,24,54,62,11,38,3,48');
insert into tbl1 values(9,'a','male','48,42,58,45,44,3,51,61,8,36');
insert into tbl1 values(10,'a','male','53,42,42,2,43,6,23,18,39,50');



50,000件

SELECT count(id) FROM tbl1 WHERE lng LIKE '%34%'; → 0.09sec
SELECT count(id) FROM tbl1 WHERE FIND_IN_SET('34',lng); → 0.03sec







CREATE TABLE tbl2
(
id int primary key,
name varchar(10),
sex ENUM('male','female'),
lng varchar(255)
);


insert into tbl1 values(1,'a','male','44,32,52,27,22,36,46,56,40,14');
insert into tbl1 values(2,'a','male','2,17,31,37,33,6,28,19,41,57');
insert into tbl1 values(3,'a','male','17,50,62,55,61,54,45,53,16,61');
insert into tbl1 values(4,'a','male','33,55,58,48,59,14,35,9,49,63');
insert into tbl1 values(5,'a','male','42,59,49,22,30,52,32,32,26,40');
insert into tbl1 values(6,'a','male','7,10,57,47,8,35,36,23,42,55');
insert into tbl1 values(7,'a','male','35,53,33,31,30,16,30,30,10,7');
insert into tbl1 values(8,'a','male','53,56,54,24,54,62,11,38,3,48');
insert into tbl1 values(9,'a','male','48,42,58,45,44,3,51,61,8,36');
insert into tbl1 values(10,'a','male','53,42,42,2,43,6,23,18,39,50');



50,000件

SELECT count(id) FROM tbl2 WHERE lng LIKE '%34%'; → ※期待した結果ではない。
SELECT count(id) FROM tbl2 WHERE FIND_IN_SET('34',lng); → 0.07sec