jsonl 形式のデータをオブジェクトとして mysql に格納する方法のメモ。
以下の jsonl のデータを MySQL に格納します。
■登録データ
{"id": "01", "x": 30, "y": 170}
{"id": "02", "x": 20, "y": 180}
{"id": "03", "x": 25, "y": 160}
{"id": "04", "x": 40, "y": 175}
{"id": "05", "x": 45, "y": 180}
■MySQL のテーブル定義
create table test1 (
obj json,
id varchar(16) generated always as (json_unquote(obj->"$.id")) stored,
x integer generated always as (json_unquote(obj->"$.x")) stored,
y integer generated always as (json_unquote(obj->"$.y")) stored,
primary key (id),
index (x, y),
index (y, x)
);
MySQL に登録する際に id を primary key とし、x、y にはインデックスを張ります。
■MySQL へのデータ登録
上記の jsonl 形式のデータを /var/lib/mysql-files/test1.jsonl に保存し、MySQL に load します。
このとき、fields terminated by '\t' を指定することで jsonl のデータが分割されないようにします。
load data infile '/var/lib/mysql-files/test1.jsonl' ignore into table test1 fields terminated by '\t' (obj);
■登録内容の確認
select * from test1;
obj id x y
{"x": 30, "y": 170, "id": "01"} 01 30 170
{"x": 20, "y": 180, "id": "02"} 02 20 180
{"x": 25, "y": 160, "id": "03"} 03 25 160
{"x": 40, "y": 175, "id": "04"} 04 40 175
{"x": 45, "y": 180, "id": "05"} 05 45 180
■primary key の確認
以下の通り、id を指定した検索では PRIMARY KEY が利用されていることがわかります。
explain select id, x, y from test1 where id = '03'\G;
*************************** 1. row ***************************
id: 1
select_type: SIMPLE
table: test1
partitions: NULL
type: const
possible_keys: PRIMARY
key: PRIMARY
key_len: 66
ref: const
rows: 1
filtered: 100.00
Extra: NULL