MySQL で json 型のデータにインデックスを張る方法のメモ。
テーブル定義でインデックスを張りたいデータ項目(x) に "generated always as (json_unquote(obj->"$.x")) stored" を指定します。
■テーブル定義
■データ登録
■検索
■実行計画
上記のクエリでは key に x が使われていることがわかります。
テーブル定義でインデックスを張りたいデータ項目(x) に "generated always as (json_unquote(obj->"$.x")) stored" を指定します。
■テーブル定義
create table test1 ( id varchar(16) not null, obj json, 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) );
■データ登録
insert into test1 set id = '01', obj = '{"id": "01", "x": 30, "y": 170}'; insert into test1 set id = '02', obj = '{"id": "02", "x": 20, "y": 180}'; insert into test1 set id = '03', obj = '{"id": "03", "x": 25, "y": 160}'; insert into test1 set id = '04', obj = '{"id": "04", "x": 40, "y": 175}'; insert into test1 set id = '05', obj = '{"id": "05", "x": 45, "y": 180}';
■検索
select id, x from test1 where x >= 30\G; *************************** 1. row *************************** id: 01 x: 30 *************************** 2. row *************************** id: 04 x: 40 *************************** 3. row *************************** id: 05 x: 45
■実行計画
上記のクエリでは key に x が使われていることがわかります。
explain select id, x from test1 where x >= 30\G; *************************** 1. row *************************** id: 1 select_type: SIMPLE table: test1 partitions: NULL type: range possible_keys: x,y key: x key_len: 5 ref: NULL rows: 3 filtered: 100.00 Extra: Using where; Using index