Upgrade to Pro — share decks privately, control downloads, hide ads and more …

MySQLのJSON機能の活用術

Sponsored · Your Podcast. Everywhere. Effortlessly. Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
Avatar for mikoma mikoma
January 28, 2026

 MySQLのJSON機能の活用術

2026/1/28開催 MySQL Technology Cafe資料
MySQLのドキュメントストア/JSONの基礎的な機能紹介をしています。
RESTサービス、JSON Duality Viewに興味のある方はこちらを参照ください。
https://oracle-code-tokyo-dev.connpass.com/event/374128/

Avatar for mikoma

mikoma

January 28, 2026
Tweet

More Decks by mikoma

Other Decks in Technology

Transcript

  1. アジェンダ 2 Copyright © 2026, Oracle and/or its affiliates 1

    2 3 4 5 6 MySQLドキュメントストア機能とは JSONとBSONの関係 使い方の基本 MySQL/HeatWave REST Service JSON Duality Views MySQL HeatWave / MySQL Enterprise Editionご紹介 前半 後半
  2. MySQL 5.7.12、2016年4月 ~ まずはおさらい!MySQLのドキュメントストア機能とは Copyright © 2026, Oracle and/or its

    affiliates 3 • X プロトコル • MySQL をドキュメントストアとして用いるために、X プラ グイン (mysqlx) により実装、デフォルト有効 • X DevAPI • SQL 処理とドキュメントに対する CRUD 処理 • 各言語の MySQL Connectors により実装 • MySQL Shell (mysqlsh) • コマンドラインクライアント (Javascript, Python, SQL) • MySQL Shell for VSCode • Visual Studio Code のプラグインとして動作する MySQL GUI (MySQL Shell、ノートブック I/F) X DevAPI X プロトコル MySQL Shell スクリプティング SQL API 標準プロトコル MySQL Connectors アプリケーション MySQL HeatWave MySQL
  3. MySQLドキュメントストア機能とは 4 Copyright © 2026, Oracle and/or its affiliates MySQL

    Xプロトコル(33060) X DevAPI SQL MySQL Shell MySQL Connectors 標準プロトコル(3306) SQL C API SQLを使わなくても CRUD実行可能
  4. なぜ今ドキュメントストア? NoSQLとRDBと生成AI 7 Copyright © 2026, Oracle and/or its affiliates

    非構造化データ JSONカラム データベース 学習データとして知識に変換 AIエージェント 機械学習モデル ベクトルストア
  5. JSONデータ型 8 ⚫ ネイティブJSONデータ型 (バイナリ形式) ⚫ insert時のJSON構文バリデーション機能 ⚫ 組み込みJSON関数 (保存、検索、更新、操作)

    ⚫ ドキュメントにインデックス設定し高速アクセス ⚫ SQLとの統合を容易にする、新しいインライン構文 ⚫ utf8mb4の文字セットとutf8mb4_binの照合 「 」 ⚫ サイズはmax_allowed_packetの値で制限 (Default:4MB) mysql> select feature from NEW57.features where json_extract(feature,'$.properties.STREET') = 'MARKET' limit 1\G ************** 1. row ************** feature: {"type": "Feature", "geometry": {"type": "Polygon", "coordinates": [[[-122.39836263491878, 37.79189388899312, 0], [- 122.39845248797837, 37.79233030084018, 0], [-122.39768507706792, 37.7924280850133, 0], [-122.39836263491878, 37.79189388899312, 0]]]}, "properties": {"TO_ST": "388", "BLKLOT": "0265003", "STREET": "MARKET", "FROM_ST": "388", "LOT_NUM": "003", "ST_TYPE": "ST", "ODD_EVEN": "E", "BLOCK_NUM": "0265", "MAPBLKLOT": "0265003"}} 外部サイト /SNS モバイル デバイス コマース /ポータル その他 (data JSON); REST/JSON Copyright © 2026, Oracle and/or its affiliates
  6. JSON データ型関数 10 Copyright © 2026, Oracle and/or its affiliates

    • JSON データ作成 • JSON_ARRAY • JSON_OBJECT • JSON_QUOTE • JSON_DUALITY_OBJECT • JSON データ変更 • JSON_ARRAY_APPEND • JSON_ARRAY_INSERT • JSON_INSERT • JSON_MERGE • JSON_MERGE_PATCH • JSON_MERGE_PRESERVE • JSON_REMOVE • JSON_REPLACE • JSON_UNQUOTE • JSON_SET https://dev.mysql.com/doc/refman/9.6/en/json-functions.html • JSON データ検索 • JSON_CONTAINS • JSON_CONTAINS_PATH • JSON_EXTRACT • -> 演算子 • ->> 演算子 • MEMBER OF 演算子 • JSON_KEYS • JSON_OVERLAPS • JSON_SEARCH • JSON_VALUE • JSON テーブル関数 • JSON_TABLE • JSON 集計関数 • JSON_ARRAYAGG • JSON_OBJECTAGG • JSON 属性データ取得 • JSON_DEPTH • JSON_LENGTH • JSON_TYPE • JSON_VALID • JSON スキーマ検証 • JSON_SCHEMA_VALID • JSON_SCHEMA_VALIDATION_REPO RT • JSON ユーティリティ関数 • JSON_PRETTY • JSON_STORAGE_FREE • JSON_STORAGE_SIZE
  7. JSONデータのインデックス化 Generated Columns MySQLのJSONはそのままインデックスを貼ることは不可 • JSONから抽出した値をGenerated Columnsとして定義するとインデックス化が可 • JSONを正規化せずにそのまま検索性能向上につながる •

    JSONから値の抽出を毎回行わなくて良い 定義例: 11 Copyright © 2026, Oracle and/or its affiliates CREATE TABLE events ( id INT PRIMARY KEY, payload JSON, user_id INT AS (JSON_UNQUOTE(JSON_EXTRACT(payload, '$.user.id'))) VIRTUAL, INDEX (user_id) );
  8. Generated Columnsとは? 他のカラムの値から計算して自動生成されるカラム • 値を書き込むのではなく、式で定義する • JSON や複雑な式の結果を 「普通の列」として扱うことが可能 •

    VIRTUAL:カラム値は保存されない。行が読み取られたときに評価される(デフォルト) • STORED:カラム値は、行の挿入または更新時に評価および保存される 定義例:直角三角形の辺の長さをsidea列とsideb列に格納 斜辺の長さ sidec(他の辺の平方の合計の平方根) の値を取得する 12 Copyright © 2026, Oracle and/or its affiliates https://dev.mysql.com/doc/refman/9.6/en/create-table-generated-columns.html CREATE TABLE triangle ( sidea DOUBLE, sideb DOUBLE, sidec DOUBLE AS (SQRT(sidea * sidea + sideb * sideb)) ); INSERT INTO triangle (sidea, sideb) VALUES(1,1),(3,4),(6,8);
  9. 例:JSON型を使ったテーブル設計例 商品情報 <products_json> 13 Copyright © 2026, Oracle and/or its

    affiliates 商品情報とサイズを管理する product_id INT PRIMARY KEY name VARCHAR(255) options JSON created_at TIMESTAMP product_id INT size VARCHAR(10) INDEX 商品サイズ<product_sizes> S INDEX M INDEX L INDEX XL INDEX Generated Column 正規化
  10. 例:JSON型 vs Generated Column vs 正規化 14 Copyright © 2026,

    Oracle and/or its affiliates 商品情報とサイズを管理する ◆ データ約100万行規模での比較例 (macOS M1, 32GB) ◆ サンプルSQL:サイズMの商品件数を抽出する (考察) • JSONに対する検索はフルスキャンとなるため実行時間が増える傾向 • Generated Column、正規化は近い性能で実行可能 • 正規化によるディスク効率低下の可能性 • 列数増加によってGenerated Columnの管理が煩雑になる可能性 方式 実行時間 JSON 615ms Generated Column 102ms 正規化 147ms
  11. JSONデータをMySQLに投入するには importJSON(<JSONファイルパス>,オプション) • MySQL上のデータベースにJSONドキュメントをインポート • 挿入したデータはSQL文やAPI関数で操作可能 • convertBsonTypes, convertBsonOid オプションを指定するとBSONデータ型のマッピングを実行

    実行例 mysqlsh <ユーザー名>@<サーバー>:ポート番号/DB名 -- util importJson < JSONファイルパス> <オプ ション> 実行例:products.jsonファイル内のJSONドキュメントを、mydbデータベース内のproductsコレクションにインポートする 15 Copyright © 2026, Oracle and/or its affiliates MySQL Shell: JSONインポートユーティリティ(MySQL8.0~) mysql-js> util.importJson("/europe/regions.json", {schema: "mydb", table: "regions", tableColumn: "jsondata", convertBsonTypes: true}); https://dev.mysql.com/doc/mysql-shell/9.6/en/mysql-shell-utilities-json.html mysqlsh user@localhost/mydb -- util importJson products.json --collection=products
  12. BSONとの関係 バイナリJSON型をMySQLで扱うためのマッピング 16 Copyright © 2026, Oracle and/or its affiliates

    BSON JSON Date date フィールドの値を含む単純な値 Timestamp timestamp time_t値を使用して作成 Decimal decimal 小数値の文字列表現 Integer int または long 整数値 Regular expression regex 正規表現のみを含む文字列 Binary data binData Base64 文字列 ObjectID objectId フィールドの値を含む単純な値 マッピングを細かく制御することも可能 • 特定のデータ型の自動マッピングを回避するオプション:ignoreDate, ignoreTimestamp, ignoreBinary, ignoreRegex, ignoreRegexOptions • BSONの「Decimal」型を、文字列ではなくMySQLのdouble型に変換:decimalAsDouble https://dev.mysql.com/doc/mysql-shell/9.6/en/mysql-shell-utilities-json-bson.html
  13. Copyright © 2026, Oracle and/or its affiliates 17 MySQLドキュメントストア利用例 (1/4)

    ...... 中略 ...... Use shell.connect('root@localhost:3826') to connect to the instance. MySQL JS > shell.connect('root@localhost:38260') Creating a session to 'root@localhost:38260' Please provide the password for 'root@localhost:38260': ********** Save password for 'root@localhost:38260'? [Y]es/[N]o/Ne[v]er (default No): Y Fetching schema names for auto-completion... Press ^C to stop. Your MySQL connection id is 11 (X protocol) Server version: 8.1.0 MySQL Community Server - GPL No default schema selected; type \use <schema> to set one. <Session:root@localhost:38260> MySQL localhost:38260+ ssl JS > session.getSchemas() [ <Schema:information_schema>, <Schema:mysql>, <Schema:performance_schema>, <Schema:sys> ] MySQL localhost:38260+ ssl JS > session.createSchema("test") <Schema:test> shell.connect APIでインスタンスに接続 (ポート:38260) スキーマの一覧を取得 SQLでの SHOW DATABASES に相当 test スキーマを作成 SQLでの CREATE DATABASE に相当
  14. Copyright © 2026, Oracle and/or its affiliates 18 MySQLドキュメントストア利用例 (2/4)

    MySQL localhost:38260+ ssl JS > const schema = session.getSchema("test") MySQL localhost:38260+ ssl JS > schema.createCollection("testCollection") <Collection:testCollection> MySQL localhost:38260+ ssl JS > schema.testCollection.add({ -> name: "MySQL", -> type: "Database", -> isOSS: true, -> version: 8.1 -> }, { -> name: "Oracle", -> type: "Database", -> isOSS: false, -> version: "23c" -> }) -> Query OK, 2 items affected (0.0197 sec) Records: 2 Duplicates: 0 Warnings: 0 MySQL localhost:38260+ ssl JS > schema.testCollection.count() 2 schemaオブジェクトを作成 コレクションを作成 SQLの CREATE TABLE 相当 コレクションにオブジェクトを追加する add APIを実行 複数行コマンドの際は、 Ctrl + ENTERで実行 追加されたオブジェクト数を確認
  15. Copyright © 2026, Oracle and/or its affiliates 19 MySQLドキュメントストア利用例 (3/4)

    MySQL localhost:38260+ ssl JS > schema.testCollection.find("isOSS = true") { "_id": "000064be0b090000000000000001", "name": "MySQL", "type": "Database", "isOSS": true, "version": 8.1 } 1 document in set (0.0018 sec) MySQL localhost:38260+ ssl JS > schema.testCollection.modify("name = 'MySQL'").set("version", "8.0.34") Query OK, 1 item affected (0.0106 sec) Rows matched: 1 Changed: 1 Warnings: 0 MySQL localhost:38260+ ssl JS > schema.testCollection.find("name = 'MySQL'") { "_id": "000064be0b090000000000000001", "name": "MySQL", "type": "Database", "isOSS": true, "version": "8.0.34" } 1 document in set (0.0008 sec) 条件を指定した検索は find APIを使用 更新はmodify APIで条件を指定 setで更新する値を指定 更新されているかを確認
  16. Copyright © 2026, Oracle and/or its affiliates 20 MySQLドキュメントストア利用例 (4/4)

    MySQL localhost:38260+ ssl JS > \sql Switching to SQL mode... Commands end with ; Fetching global names for auto-completion... Press ^C to stop. MySQL localhost:38260+ ssl SQL > SELECT JSON_EXTRACT(doc, "$.name") FROM test.testCollection; +-----------------------------+ | JSON_EXTRACT(doc, "$.name") | +-----------------------------+ | "MySQL" | | "Oracle" | +-----------------------------+ 2 rows in set (0.0007 sec) MySQL localhost:38260+ ssl SQL > SQL モードへ変更 コレクションの元となるテーブルには docカラムがあり、JSON オブジェクトは その中に格納されている
  17. MySQLをドキュメント・データベースとしても運用可能 • RDBMSのテーブルとJSONドキュメントをシームレスに利用 • アプリケーション開発の要件に応じてSQL文とNoSQL APIを利用 • MySQLのNoSQL APIは"X Dev

    API"と呼ばれる • CRUD操作を提供 = Create, Read, Update, Delete • MySQLサーバーのXプラグインが必要 (デフォルトで有効) • クライアント<->サーバー間はXプロトコルで通信 • Xプロトコル用のポートはデフォルトでは33060, SSL有効 • サンドボックスでは指定ポート番号の10倍がデフォルト • クライアントはMySQL Shellおよび各MySQL Connectorsが対応 • ドキュメント (最新版): https://dev.mysql.com/doc/refman/9.6/en/document-store.html MySQLドキュメントストア Copyright © 2026, Oracle and/or its affiliates 21 { } SQL文 NoSQL API SQL文 NoSQL API テーブル SELECT 列名.. FROM テーブル名 .. テーブル名.select(). .. JSONドキュメント SELECT JSON_EXTRACT(列名, 条件..).. FROM テーブル名 .. コレクション名.find(). .. テーブル JSONドキュメント