mysql データベースで json データを効率的に検索するにはどうすればよいですか?
labs.mysql.com から extract_json udf をインストールし、2.750.000 エントリのテスト テーブルをいじってみました。
CREATE TABLE `testdb`.`JSON_TEST_TABLE` (
`AUTO_ID` INT UNSIGNED NOT NULL AUTO_INCREMENT,
`OP_ID` INT NULL,
`JSON` LONGTEXT NULL,
PRIMARY KEY (`AUTO_ID`)) $$
JSON フィールドの例は次のようになります。
{"ts": "2014-10-30 15:08:56 (9400.223725848107) ", "operation": "1846922"}
json_extract を select ステートメントに入れても、パフォーマンスへの影響はほとんどないことがわかりました。つまり、次の select は (ほぼ) 同じパフォーマンスを発揮します。
SELECT * FROM JSON_TEST_TABLE where OP_ID=2000000 LIMIT 10;
SELECT OP_ID, json_extract(JSON, "ts") ts, json_extract(JSON, "operation") operation FROM JSON_TEST_TABLE where OP_ID=2000000 LIMIT 10;
ただし、json_extract 式を where 句に入れるとすぐに、実行時間が 10 倍以上増加します (2.5 秒から 30 秒になりました)。
SELECT OP_ID, json_extract(JSON, "ts") ts, json_extract(JSON, "operation") operation FROM JSON_TEST_TABLE where json_extract(JSON, "operation")=2000000 LIMIT 10;
この時点で、挿入時に検索したいすべての情報を個別の列に抽出する必要があると考えています。本当にjsonデータを検索する必要がある場合は、最初に検索する行数を絞り込む必要があります他の基準によるものですが、明らかなものを見逃していないことを確認したいと思います。たとえば、どうにかして json フィールドにインデックスを付けることができますか? または、select ステートメントの記述が非効率的ですか?