MySQL Shell で JSONドキュメントと戯れてみる

この記事は最終更新から4年以上経過しています。内容が古くなっている可能性があります。

MySQL 5.7.12 で X Plugin がリリースされてから、 MySQL Server を JSON形式の Document Store として扱えるようになりました。

MySQL の Document Store に関連する弊社の記事として、以下の記事がございますので、興味があれば、ご一読下さい。

また、MySQL 5.7.8 から使用可能となったJSONデータ型についても以下の記事がございますので、未読の方は是非、一読頂ければと思います。

今回は執筆時点の最新バージョン(8.0.18)の MySQL Server と MySQL Shell を使用して、JSONドキュメントと戯れてみたいと思います。

目次

環境の準備

MySQL Server と MySQL Shell は同一サーバにバージョン 8.0.18 がインストール済みであるものとします。
また、MySQL Server 5.7 では、インストール後に X Plugin を有効にする必要がありましたが、MySQL Server 8.0 からはデフォルトで有効になっています。

確認用のデータとして、公式サイトで提供されている Example Databases のうち、「world_x」データベースにJSONデータが含まれているので、これを使用して確認したいと思います。

まずは、「world_x」のダンプファイルをダウンロードします。

MySQL Shell から、ダンプファイルをインポートするデータベースを作成します。
データベース名も「world_x」としています。

作成した「world_x」データベースにダウンロードしたダンプファイルをインポートします。

データベース・テーブル確認

MySQL Shell のSQLモードでログインし、テーブルを確認します。

MySQL Shell のログイン後のプロンプト表示は、本来 MySQL localhost:33060+ ssl world_x SQL > のように表示されますが、長いので MySQL Shell (SQL or JS) > のように表記しております。

4つのテーブルが作成されていますが、これらのうちJSONデータを保持するテーブルは「city」「countryinfo」の2つとなります。
「city」テーブルは従来の各カラムを定義した中にJSON型のカラムを設けたテーブルとなっています。

一方、「countryinfo」テーブルは Collection といわれるJSONドキュメントを格納する雛形的なテーブルとなり、Document Store として使用したい場合は一般的にはこの形式を使用する事になるかと思います。
ドキュメントを格納するjson型の「doc」カラムとドキュメントの「_id」フィールドと紐づく仮想列の主キーで構成されています。

本記事は、こちらの Collection を MySQL Shell の Javascript モードを使用してNoSQLライクにドキュメント操作してみます。

MySQL Shell で Collection の確認

MySQL Shell でログインし、Collection を確認します。

「countryinfo」が Collection として存在しているのが確認できます。

ドキュメント操作(検索)

ドキュメントを検索するには find 関数を使用します。

取得するフィールドの指定や、指定する値を変数にバインドしたりする事も可能です。

Collection には仮想列の主キー(_id)が存在しますが、主キーを指定する場合は、getOne() で条件指定する事もできます。

また、レコード数をカウントしたい場合は、以下のように非常にシンプルに取得できます。

その他にも、sort や group by の指定等も可能なので、非常に幅広い検索方法を指定する事ができます。

ドキュメント操作(登録)

ドキュメントを登録するには add 関数を使用します。

以下のように既存データにある全てのフィールドを指定しなくても登録する事が可能です。

また、既存データにないフィールドを追加する事もできます。
テーブル構造を変更する為にALTER文を実行する必要もなく、Document Store を使用する利点でもあるかと思います。

また、主キー(_id)を省略した場合には、自動的に生成された乱数が主キーに設定されます。

ドキュメント操作(更新)

ドキュメントを更新するには modify 関数を使用します。

先程、登録したレコードの "Name": "MyCountry1" の「demographics.Population」の値を更新してみます。

「demographics」フィールドを削除してみます。

再度、「demographics.Population」フィールドを追加してみます。

フィールド値の配列を操作することもできます。

ドキュメント操作(削除)

ドキュメントを削除するには remove 関数を使用します。

remove関数の引数に条件を指定して削除します。

フィールドの値でソートして、件数指定して削除したりする事もできます。
以下は「demographics.Population」の値が低い上位5件を削除しています。

ドキュメント操作(トランザクション)

ACID にも準拠しており、Document Store として使用した場合にもトランザクションが使用可能です。
トランザクションを発行する際は、sessionオブジェクトを使用します。

ドキュメント操作(インデックス)

Collection内のフィールドにインデックスを作成する事もできます。

まずはインデックスの有効性を確認する為に、簡単に100万件レコード存在するJSONファイルを作成します。

MySQL Shell でログインし、作成したJSONファイルをインポートする Collection(smartstyle)を作成します。

MySQL Shell 8.0.13 で機能追加された JSON Import Utility で、作成した Collection にJSONファイルをインポートします。

それでは、 name フィールドにインデックスを付与し、name フィールドを条件指定した検索を実行します。

実行時間は 0.0094秒 となりました。
MySQL Severの General Query Log を有効にして find 関数実行時に実際に実行されたSQLを確認し、MySQL Shell の SQL モードで EXPLAIN してみました。

付与した nameIndex が使用されていることが確認できますね。
(SQLが整形された旨のメッセージが出力されます。)
また、付与したインデックスを削除して、再度、検索を実行して、検索速度の違いを確認します。

インデックスが存在しない場合は、1.5秒程度の検索時間を要していますが、インデックスを付与した場合は0.01秒未満となっています。
簡単な検証ではありますが、インデックスが有効に作用されている事が分かります。

まとめ

今回は、MySQL Shell で操作を行いましたが、以下のコネクタにも「X DevAPI」が実装されており、同じように NoSQL で JSON ドキュメントの操作が可能です。

他のドキュメント指向データベース製品を使用されていて不満を感じられている方や、MySQL Server+別データベース製品を使用していて、MySQL Server だけで事足りるかもと感じられた方は、是非、お試し頂ければと思います。

これから MySQL がより幅広く使用されていく事を期待したいと思います。


 

 

スマートスタイルTECHブログについて

スマートスタイルTECHブログでは、日頃MySQLのサポート業務に従事している有資格者で構成された技術サポートチームがMySQLに関する技術情報を発信しています。データベースのお困りごとはお気軽にご相談下さい。

よかったらシェアしてね!
  • URLをコピーしました!
目次