TiDB Cloud へ FileMaker から ODBC 接続してみる。初期設定からパフォーマンス検証まで

# はじめに
## 対象読者
* [Claris FileMaker](https://www.claris.com/ja/filemaker/) ユーザ
* FileMaker で ODBC 接続して MySQL と連携させているよという人
* MySQL の代わりに MySQL ODBC Driver 互換で接続できるデータベースサービスが気になる人
* どちらかというと FileMaker ユーザ向けに TiDB Cloud というものがあるよ、ということを紹介するための記事であって、その逆ではない

## what TiDB
* [公式サイト](https://pingcap.co.jp/tidb-overview/)
* 説明文を公式サイトから引用

> TiDBは、MySQL互換のスケーラブルなデータベースです。
クラウド/DX化でのデータベースの課題解決を支援します。

## what TiDB Cloud
* [公式サイト](https://pingcap.co.jp/tidb-cloud/)
* 説明文を公式サイトから引用

> フルマネージドサービスのTiDB Cloudは、TiDBの優れた機能をクラウド上で全て使用することができます。TiDB Cloudを利用することで、データベースの複雑さを気にすることなく、アプリケーション開発に集中することが出来ます。


# TiDB Cloud への登録
## アカウント作成
* まずは公式サイトからメールアドレス／パスワードを入力して登録開始。メールアドレス宛てに確認が届くので、認証しておきます。
* 認証後に、先ほどのメールアドレス／パスワードでログインを求められるので、ログイン。
  * 細かいことですがログインには [Auth0](https://auth0.com/) が導入されているよう。
* すると以下のように Tier の選択画面が出てくるので、ここでは FREE の Developer Tier を選んでおきましょう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/37739/99440284-e685-dccc-0396-faa89369e3cb.png)

## Cluster 作成
* 以下のような画面で Cluster の作成を求められます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/37739/48e8f320-fe0b-ba2c-f29d-cefdf3042d1a.png)

### 名前
* 任意で入力。

### リージョン
* 無料枠ながらなんと Tokyo (ap-northeast-1) が選べます。素晴らしい。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/37739/1306daf6-9ba0-b41d-8713-9c131f7fc4d1.png)

### 作成完了まで待機
* 下端の Create ボタンを押すと次の画面へ遷移。
* 以下のような感じで、ぐるぐるとしばらく作成中……になるので完了まで待機です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/37739/80593856-7c23-c3f8-9432-9ee1dac4a6f8.png)

### 作成完了
* 5 分ほど待って完了すると以下のような画面に。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/37739/d12bc1b5-81c2-57fa-96af-3202f7632c01.png)

## Cluster の確認
* 作成した Cluster の名前を押すと、詳細なダッシュボード画面に遷移します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/37739/2ebfe83f-f496-a7f5-de78-b36c1cd5492b.png)

* メールアドレスや接続情報なども出ているので、画面全体をキャプチャするのは避けておきます。
* リソースモニタリングのグラフなんかも完備されていますね。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/37739/274e874d-2939-4b0a-4925-036c15fd3499.png)

* overview からタブを切り替えると以下のように。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/37739/ab97066f-3a3e-6931-d4a4-d19b5aff7231.png)

* データのインポートなんかも GUI 上から簡単にできるようです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/37739/418025ba-49a5-928e-0579-e2451db4fff6.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/37739/df6513e6-f32b-b7e9-9317-a77508a079ad.png)

* バックアップは無料版では提供されていない機能。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/37739/bb49647d-2457-70e0-50fd-60da263f8e51.png)

* 発行された SQL も GUI で見られるの便利ですね。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/37739/5e17133c-d419-9c91-d375-fba26a4baf90.png)

* SlowQuery まで確認できる。至れり尽くせり。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/37739/c405ddbc-ab78-4aa0-5769-8a777b09741b.png)

* 視覚化まで。タイムゾーンはデフォルトはグリニッジ標準時のようす。
  * 記事の末尾で、データベース側のタイムゾーンの変更について触れます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/37739/8b2a5620-58cc-b7eb-2822-54b2e9bea5e5.png)

* タイムゾーンは変更できます。
    * 右上に表示されている自身のアカウント名をクリックすると `organization settings` というメニューが表示されるので、そこから設定できる画面が開かれます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/37739/530bb573-6ad6-1cd7-39b6-8c439a6162d2.png)


## Cluster への接続設定
* 右上の Connect ボタンを押すと以下のようなモーダルが表示される。
* まず Step 1 で IP address による接続制限がかけられるので、良きように設定。
  * デフォルトだと現在接続中の IP が入力されるようになっています。
  * 後ほど FileMaker Server からの接続をおこないたいわけなので、FileMaker Server の IP を登録しておくとよいでしょう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/37739/0bdbe175-1c2f-ebc3-6ae5-45b3092fac70.png)

* Step 2 で MySQL Client での接続テストをおこなうことになりますが、事前に Connect ボタンの右隣にある三点メニューから root パスワードを設定しておく必要があります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/37739/abf0d6c7-0d90-7d09-bd7b-839950e6bf50.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/37739/c0dae8e0-6204-2274-5bfa-e28037941066.png)

* あとは Step 2 として表示されている案内にしたがって接続テストをおこない、無事に接続できればヨシ。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/37739/20e54c26-db8f-dff4-174b-8f4f63775228.png)

* 以下は Linux の MySQL Client から接続して成功した例。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/37739/f3b748cc-b126-3912-a31a-1208b4aaf361.png)

## テーブルデータの用意
* 上記の通り、 TiDB CLoud に MySQL コマンドで接続している状態から話を続けます。
* `show databases;` を実行すると、あらかじめ test データベースが用意されているのが見えます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/37739/b4262233-2610-5e45-2e77-9724096cfcdb.png)

* ただし `show tables from test;` を実行してみると、テーブルは空っぽですね。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/37739/8a299b17-e2e6-7d56-89b5-1c1b55efe4a9.png)

* なのでテーブルを作成します。公式ドキュメントに従ってやってみましょう。
  * [PingCAP - TiDB - テーブルを作成する](https://docs.pingcap.com/ja/tidb/v6.2/dev-guide-create-table)

* まずデータベースは既にある `test` を使うことにします。

```sql
use test;
```

* 公式ドキュメントに `books` テーブルを作成するコマンドがあるので、そちらを引用して実行します。
  * テーブル名を `test` に書き換え。
  * ついでに主キーも設定。
  * `id` は `AUTO_RANDOM` な値が入るように。
    * ここで `AUTO_RANDOM` を設定すると、記事の後のほうで苦労することになりますので、苦労をしたくない人は属性付与しないでおいてください……

```sql
CREATE TABLE `test`.`books` (
  `id` bigint AUTO_RANDOM,
  `title` varchar(100),
  `type` enum('Magazine', 'Novel', 'Life', 'Arts', 'Comics', 'Education & Reference', 'Humanities & Social Sciences', 'Science & Technology', 'Kids', 'Sports'),
  `published_at` datetime,
  `stock` int,
  `price` decimal(15,2),
  PRIMARY KEY (`id`)
);
```

* あらためて `show tables from test;` を実行すると、ちゃんと books テーブルが作成されている。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/37739/61a712e3-d92f-28e9-2da5-57d13d927c4f.png)

* `show columns from books;` でカラムが作成されていることも確認。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/37739/9f27df4a-e914-1502-da94-24e868be619c.png)

* TiDB の管理画面でも実行した SQL 文が確認できる。クエリの実行時間の詳細がここまですぐに見られるのはとても魅力的！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/37739/bbfa5451-5460-6761-1d98-6e449d460ba2.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/37739/aac4de3c-3003-ff6e-9567-e3dfce6fa9f1.png)


# FileMaker Server の設定
## MySQL ODBC Driver のインストール
* では次に FileMaker Server 側の設定へ進みます。
* 最初に MySQL ODBC Driver のインストールをおこないます。
* 詳細は以下、私の書いた過去記事をご参照ください。
  * [Qiita - FileMakerServer19稼働のCentOSサーバにMySQLのODBCドライバを設定](https://qiita.com/Hi_Noguchi/items/b5e49c7aef376df8ceaf)
* 簡易的にコマンドだけ貼り付けておきます。

```
sudo rpm -Uvh http://repo.mysql.com/mysql80-community-release-el7.rpm
sudo yum install mysql-connector-odbc
```

## odbc.ini の準備
* 次に odbc.ini ファイルを用意しましょう。
  * [Claris 公式ヘルプ - 外部 ODBC データソースへのアクセス](https://help.claris.com/ja/server-help/content/xbdc-access.html)
* 以下のようにエディタに応じたコマンドで作成／編集。

```
sudo vi /etc/odbc.ini
```

* 中身を以下のようにします。要注意点としては Port が 4000 であることでしょうか。

```odbc.ini
[ODBC Data Sources]
TiDB_FileMakerTest = MyODBC 8.0 UNICODE Driver DSN

[TiDB_FileMakerTest]
Driver           = /usr/lib64/libmyodbc8w.so
SERVER           = [[ダッシュボード上に Endpoint として記載されているもの]]
PORT             = 4000
Database         = test
OPTION           = 3
INTERACTIVE      = 1
BIG_PACKETS      = 1
NO_PROMPT        = 1
COMPRESSED_PROTO = 1
AUTO_RECONNECT   = 1
MULTI_STATEMENTS = 1
```

## FileMaker Pro から TiDB Cloud への接続
* さて今回、あらかじめ FileMaker Server 上にファイルが既にホストされている、という前提で話を進めます。そのファイルを開いて TiDB への接続設定をおこなっていきます。
* `ファイル` > `管理` > `外部データソース` を選択。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/37739/b291dc7c-ef75-0c2f-7785-e8f6b53e88a3.png)

* データソースの編集ウィンドウで `タイプ` を `ODBC` にして `DNS` の右端にある `指定` ボタンを押すと、以下のようなウィンドウが表示されて odbc.ini に記述したものが表示されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/37739/458a10a1-b373-8903-705a-7975881e4d81.png)

* 上記を選択して進めた次には、認証設定です。ユーザ名／パスワードについては、本来は `root` 以外のユーザを用意しておくのが正しいわけですが、ここではひとまず `root` で、先ほど設定したパスワードを入力しましょう。
  * なお `root` ユーザを入力する際には、ダッシュボード上に記載されている通りに。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/37739/5e7d4257-dbf0-27a2-da21-4956d2c294ec.png)

* `ファイル` > `管理` > `データベース` > `リレーションシップ` を選択して、新しくテーブルオカレンスを追加しようとすると、データソースとして `TiDB_FileMakerTest` など先ほど追加したものが選べるようになっています。
* それを選ぶと、先ほど作成したテーブル books が表示されました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/37739/c39bf226-cbcc-133f-eb59-d8f2e9d484da.png)

* books を選んで進めると、以下のようにテーブルオカレンスとして出現。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/37739/8e2bcbef-e00d-ecc5-eda8-e50f401060b9.png)

* タブを `フィールド` に切り替えてみても、中身がしっかり定義されて出てくれています。
  * `enum` 型であった `type` カラムは FileMaker 上では `テキスト` として処理されてしまっていますね。これはいたしかたない。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/37739/38985ac5-19fe-00f0-0ff2-6edfe61a9931.png)

## 表示等操作のためのレイアウト用意
* この追加した TiDB Cloud 上の books テーブルを FileMaker Pro で表示等操作するためのレイアウトを用意します。
* 用意、といっても既にテーブルオカレンスを追加した時点でレイアウトが作成されている（設定による）ので、レイアウトを books に切り替えてみると、既にフィールドもありますね。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/37739/3181c02e-9a37-3af1-4144-67332dbad477.png)

## FileMaker Pro 側からレコードを作成
* 試しにひとつレコードを作成してみましょう。
* 『方丈記』を入力して……おや、怒られました。先ほど設定した `auto_random` が悪さをしてしまった様子。余計なことをやってしまったな……

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/37739/e2dff6f9-cd26-07cc-d40a-82676f368946.png)

## `@@allow_auto_random_explicit_insert` について
* 公式ドキュメントを確認してみます。
  * [PingCAP - TiDB - AUTO_RANDOM](https://docs.pingcap.com/ja/tidb/stable/auto-random)

https://docs.pingcap.com/ja/tidb/stable/auto-random

* 引用すると、以下とのこと。

> v4.0.3 以降、値を明示的に挿入する場合は、システム変数@@allow_auto_random_explicit_insertの値を1 (デフォルトでは0 ) に設定します。この明示的な挿入はデフォルトではサポートされておらず、その理由は制限セクションに記載されています。

* ではシステム変数をどのようにして変更したら良いかもドキュメントを確認してみます。
  - [PingCAP - TiDB - システム変数](https://docs.pingcap.com/ja/tidb/stable/system-variables)

https://docs.pingcap.com/ja/tidb/stable/system-variables

* 引用すると、以下とのこと。

> 変更はSETステートメントを使用して行われます。

* なので MySQL client で接続して、以下のコマンドを実行します。
  * global であることを明示することが必要そうです。

```sql
SET @@global.allow_auto_random_explicit_insert = 1;
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/37739/cebe4ce8-14a7-be4e-9e90-58ae5e284794.png)

* 管理画面上でも確認できたので、届いたのでしょう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/37739/1ac6a252-a920-820a-8581-92b4be5e6630.png)


## ふたたび FileMaker Pro 側からレコードを作成
* ということで FileMaker Pro へ戻ってきて今度こそ……！
* はい、無事に登録できました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/37739/806ad05c-8793-c46a-3fe4-05edde59c966.png)

* あれだけ苦労した AUTO_RANDOM 設定、FileMaker Pro 経由だとこのように怒られてしまって自動で採番されてくれません。残念……

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/37739/a61040c3-ee52-ada5-f3b1-77a74b1eddb0.png)



# 速度検証_経過編
## 前置き
* FileMaker Pro から ODBC 接続で MySQL 等の外部データソースを閲覧する際、どうしてもネックになるのが速度が遅い、という点です。
* なので、いくつかの実験をして TiDB Cloud ならどのくらいのパフォーマンスが出るのか、検証してみます。
* この `経過編` けっこう長いので、さっくりと比較表で結果だけ見たい！　という方は、スーッと下の方に飛んでいって `まとめ編` をご覧ください。

## 準備。データセットの用意
* まずデータセットについてですが、どこかしらかダウンロードしてきたり、ヨソで生成したきたりしてもよいのですが、せっかくなので FileMaker Pro 上でレコード作成をループでおこない、これ自体をパフォーマンステストしてみましょうか。
* FileMaker Pro からは残念ながら bulk insert みたいなことができないので、地道に n 件の SQL 発行する感じです。

### 事前準備
* 比較用に FileMaker Pro 側でも同じ構造のテーブルを用意しておきます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/37739/ccedf811-761b-011a-18ef-8ddc11491ad1.png)

* また TiDB 側の books テーブルにも index を張っておきます。
* TiDB の管理画面に Playground があり、そこから実際に SQL を実行することができるようになっていますので、ここからやってみましょう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/37739/012ee2a2-5ea4-a2e8-8cae-13f4b2cd7bd1.png)

* 左側メニュー一番下の `Edit and Run Your SQL` を選び、実際に SQL を書いて実行すると、たとえば以下のようにその場で結果が表示されます。便利ですね。

```sql
show columns from test.books;
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/37739/5c8d5804-36ee-2759-be6d-70fc78f69275.png)

* `title` と `type` に index を張ってみましょう。

```sql
ALTER TABLE test.books ADD INDEX index_books_on_title(title);
ALTER TABLE test.books ADD INDEX index_books_on_type(type);
```

* あらためてカラムを確認すると、しっかり張られたことが確認できますね。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/37739/d4c0988e-9d66-2d67-2d1f-4bfe524a05b3.png)



### スクリプト作成
* レコード作成するためのスクリプトを作ります。完成形は以下です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/37739/ef99d686-e22b-5b46-ee26-f3549986c00d.png)

### 前提
* 今さらですが FileMaker Server を稼働させているサーバのスペックは以下の通りです。TiDB の問題というより FileMaker Server 側の問題として、スペック上げればもう少しパフォーマンス出るはず。
  * ConoHa VPS
  * リージョン 東京
  * メモリ 1GB
    * 貧弱貧弱ゥ……！
  * CPU 2 core
  * ストレージ SSD 100GB

https://www.conoha.jp/vps/pricing/

### FileMaker Pro 側のテーブル
* 上記、用意したスクリプトの変数 `$env` を `fm` にセットしてからスクリプトを実行してみます。
* ループ回数を 1,000,000 にして 100 万レコードを作成してみましょうか。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/37739/591dcd20-74b0-d543-56c6-dd551f6f53fe.png)

* 一晩走らせてみてこんな感じでした。……うん、100 万レコードはやめて、まず 1 万レコードくらいでやってみましょう……
* せっかく作成した 100 万レコードについては csv データとしてエクスポートして保管しておきます。後で使います。
* 1 万レコードの結果は以下の通り。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/37739/c73d578a-e13e-d5a7-a9e0-738a322fd14b.png)


### TiDB 側のテーブル
* 今度は TiDB 側のテーブルにレコードを作成してみます。変数 `$env` を `tidb` に変更して実行。
* 1 万レコードの結果は以下の通り。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/37739/45ee1636-48f4-da7c-e41e-c90b81831871.png)

* さすがに ODBC 接続している先に SQL を投げているので FileMaker 側のテーブルへ実行するより遅いですが、FileMaker ユーザ感覚からすると問題なく許容範囲です。

## レコードのインポート
* では、先ほど csv として待避しておいた 100 万行のレコードを、それぞれのテーブルへ食べさせてみたいと思います。
* あらかじめ先ほど 10,000 件作成したレコードは削除しておきます。
* オマケ的にそのパフォーマンスも測ってみますが、FileMaker 側は一瞬でした。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/37739/d53f9d31-2014-d353-2a2c-15e212f8a981.png)

* TiDB 側もどうか……と思って試したところ、効いてくれませんでした。削除されません。ドキュメントによると FileMaker 側としてサポートしていない様子。
  * 試したこと無かったから知らなかった……

> [現在のテーブル] を選択しており、このスクリプトステップが実行されたときのアクティブなテーブルオカレンスが ODBC データソースからのものである場合は、[テーブルデータを削除] はスキップされてエラーコードが返されます。アクティブなテーブルオカレンスが外部の FileMaker Pro ファイルのものである場合、[テーブルデータを削除] は通常どおり実行されます。

https://help.claris.com/ja/pro-help/content/truncate-table.html

* なので `対象レコードの削除` で実行。作成に比べると高速ですね。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/37739/18100f25-9e4a-960f-b743-1f4efa005f49.png)


### FileMaker 側
* まずは FileMaker 側から。
* 結果は 12 分ほどと、まあまあまずまずな感じです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/37739/ff8f2a83-967f-f17d-1e05-492d28a804a4.png)


### TiDB 側
* お次は TiDB 側……
* ……ということで試してみたのですが、数時間経過して 75 万レコードほどがインポートされたあたりで FileMaker Pro が強制終了で落ちてしまいました。
* このように FileMaker Pro を通じて ODBC 接続先に大量データを食べさせようとする試みは、なかなかにうまくいきません。ので、別ルートでデータを用意しましょう。

### SQL で TiDB へデータインポート
* TiDB の管理画面に import メニューがあるので、そこから csv を食べさせられるかどうか見てみましょう。
* どうやら AWS S3 環境が必要とのこと。ローカルから直接 csv アップロードできるともっと便利になりそうです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/37739/ea66378f-d98c-46fb-22b9-e25783734d04.png)

* 今回はおとなしくサーバ側に csv をアップロードしてインポートさせます。カラム順はそのままにということで……

```sql
load data local infile "/home/username/csvname.csv " into table test.books fields terminated by ',' optionally enclosed by '"';
```

* もしまだ `local_infile` を有効にしていなければ、事前に有効にしてからにしましょう。TiDB においても MySQL と同様です。有効にしてあれば `--local-infile` オプションをつけてデータベースへ接続します。

```sql
SET GLOBAL local_infile = 1;
```

https://docs.pingcap.com/ja/tidb/stable/sql-statement-load-data

* ……で、これでうまくいくと思いきや。何か warnings が出て失敗します。うーむ。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/37739/ebd95af8-7281-e640-45aa-1ae6e3d4a0c7.png)

* 小数点つけておけばいいのか……？　と思って置換処理かけてみてもダメでした。FileMaker Pro からのインポートならうまくいっていたのですが・・

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/37739/591ac3d4-7b57-1dc6-587b-2953dba48be7.png)

* ということで大人しく `price` カラムを INT 型にしておこう……

```sql
alter table test.books modify price int;
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/37739/e898eaf3-9984-0454-2ee2-5d70f659c7fd.png)

* しかしこれでもダメ。えええ……おかしなレコードは一つもないはずなんだけれどな……
* ……ここで気づく。改行コード問題！　CRLF になっていた！　ということで SQL に `lines terminated by '\r\n'` を追記。
  * 恥ずかしや。初心者かい！　っていう……
  * 型を変える必要もありませんでした。まあ戻す必要もないか……

```sql
load data local infile "/home/username/csvname.csv " into table test.books fields terminated by ',' optionally enclosed by '"' lines terminated by '\r\n';
```

* すると今度はサーバが落ちるようになってしまった。なんで。
  * 一度ダウンすると数分何もできなくなる。数分後に復旧される。管理画面から明示的に再起動をすることもできなそう……？
  * AWS の障害でもなさそう。
  * 100 万行だと重いのかと思って 50 万行に減らしてみてもダメでした。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/37739/a2205c0d-39b8-8508-01f4-8eb3b6195a12.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/37739/56f07060-cc2a-ee54-d561-30fd4d30ba22.png)

* ダウン中に接続を試みるとユーザ名が違うと怒られる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/37739/2afa6b9d-012b-2838-364e-f57125cedf1d.png)

* 10 レコードに絞ったインポートは正常完了しました。しかし 10 行では……

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/37739/0d1fd255-b33c-d976-d1f4-17fa53042d6d.png)

* 再度 50 万レコードを試すとやはりダウン。おおう……
* ……ということで 5 万レコードの投入に留めることに。実行直後、以下のように怒られたのですが、実際は 50,000 レコードが無事に作成されていました。何だろう……？
  * なお FileMaker 側は 100 万レコードなのですが、内部データベースと外部データベースを比較しても……というのはあるので、ハンデとして……

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/37739/f0f17314-176d-b403-6d94-003d8f72fddc.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/37739/230214f5-b4e3-bad5-9d56-f39756c5901f.png)



## レコードの検索
### スクリプトの準備
* 本のタイトル `title` に `3` という値が含まれているレコードを検索する、ということでやってみましょう。
* 以下のようなスクリプトになります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/37739/13fdef4a-5788-254b-5231-a59524614b95.png)


### FileMaker 側
* まず FileMaker 側からですが 1 秒以内で結果が表示されました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/37739/087c7e13-fcb7-b1bf-5c26-41b25d677b31.png)


### TiDB 側
* TiDB のほうは、複数回実行してみましたが、毎度 3 秒でした。
* FileMaker Pro ユーザとしては、実用性は十分ですね。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/37739/112a6235-77d9-9b78-f71d-4149909369eb.png)
 

## レコードのソート
### スクリプトの準備
* 続いて本のタイトル `title` で降順ソートしてみます。
* スクリプトは以下の通り。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/37739/e8438658-6fc4-9766-09f8-cec603344197.png)


### FileMaker 側
* 25 秒ほどでした。ソートだけでも結構かかりますね。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/37739/9e4a0ecb-6b87-6346-f897-cc20b7ca2a9f.png)


### TiDB 側
* TiDB のほうは、これも 3 秒でした。
* さすがに FileMaker 側とはレコード数が違う！　というのはあるのですが、 50,000 レコードくらいだと全く問題なさそうです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/37739/75133b15-c49c-57e5-4c06-2e25b61fd151.png)


## フィールド内容の全置換
### スクリプトの準備
* 最後にフィールド内容の全置換を試みます。本のタイトル `title` について、全く同じ内容を再度書き込むというかたちで。
* 対象レコードは 100 万だと多すぎるので 1 万に絞る処理を挟みます。
  * 試しに FileMaker 側で 100 万で試してみたところ、お察しな時間のかかり方だったので減らしました。
* スクリプトは以下の通り。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/37739/b975083b-5a01-80d1-fe3f-d943103de65a.png)


### FileMaker 側
* 1 分 22 秒。いやはや、結構かかりますね。
* 100 万だと単純に 100 倍なので 2 時間くらいですか。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/37739/38c7ec69-2da1-f8dc-8559-0ff30446e15a.png)


### TiDB 側
* TiDB のほうは 2 分 41 秒。
* FileMaker 側と同レコード数でこれというのは、なかなかの健闘っぷりではないでしょうか！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/37739/8c97a5a7-77f2-f578-86a9-ab916a1ae4fb.png)

## 比較対象の追加。PlanetScale
* えー、ここまで来ておいてナンですが、比較対象が FileMaker 本体の内部データベースだけだと、やはり実質的な比較にはならないですよね。
* ということで今回は [PlanetScale](https://planetscale.com/) の [Free 版](https://planetscale.com/pricing) を用意してみます。
  * PlanetScale の環境設定は別記事にて掲載予定ということで省略します。
* なお PlanetScale のレコード数は TiDB と同じく 5 万としました。

### レコードの検索
* PlanetScale では 3 秒。
* TiDB と同じですね。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/37739/9af82769-842e-4a4f-9ee9-422def31b717.png)


### レコードのソート
* PlanetScale では 5 秒。
* TiDB と有意に差がつきましたね。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/37739/066146a2-2d59-a713-41df-576d5af55c3d.png)


### フィールド内容の全置換
* PlanetScale では 3 分 8 秒。
* こちらも TiDB よりも遅めです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/37739/0333f3e1-41ee-c351-3608-491873433ffd.png)


# 速度検証_まとめ編
* ということで `まとめ編` として、以下、表にまとめてみました。
* 外部データベースとして ODBC 接続を経由する TiDB Cloud は、さすがに FileMaker そのものと比べると分が悪くなりますが、同じ ODBC 接続の PlanetScale と比べたら良いパフォーマンスを発揮してくれていることが分かります。

|                        | FileMaker              | TiDB                   | PlanetScale             | 
| ---------------------- | ----------: | ----------: | -----------: | 
| レコードの検索         | 0 分 1 秒  | 0 分 3 秒  | 0 分 3 秒   | 
| レコードのソート       | 0 分 25 秒 | 0 分 3 秒  | 0 分 5 秒   | 
| フィールド内容の全置換 | 1 分 22 秒 | 2 分 41 秒 | 3 分 8 秒   | 

* ※注意点
  * それぞれのテーブルのレコード数は以下の通り
    * FileMaker : 100 万
    * TiDB, PlanetScale : 5 万
  * ただし `フィールド内容の全置換` はすべてにおいて 1 万レコードに絞り込まれている

# おまけ
## タイムゾーンの変更
* TiDB 管理画面の Playground からタイムゾーンの変更をおこなってみましょう。
* デフォルトだと以下のような設定だと確認できます。

```sql
SELECT @@global.time_zone;
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/37739/d2725285-6f37-3b6c-feaa-a3b84d66e6cc.png)

* これを日本へ変更します。

```sql
SET GLOBAL time_zone = '+9:00';
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/37739/6e5b18e6-4bf9-6dfb-695a-7e37b298d20e.png)

* ……はい、怒られました。Playground では権限が不足するようです。そりゃそうですね、Playground ですからね。
* ということでサーバへログインしてから SQL 実行しましょう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/37739/9cf0ba65-9e2e-66cb-cc46-5bb7386fff16.png)

* 再度 Playground で確認してみると、正常に反映されています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/37739/934d9653-be7c-2ff8-b7a5-8e1fc2006bcd.png)

## Playground では安心して SQL 実行できる
* 上記のように Playground では怒られて実行できないことはあります。たとえば `truncate` = テーブルデータ削除のような、危ないことなんかもできません。

```sql
truncate table test.books;
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/37739/da2c16f4-0a1f-f6b1-3b6b-cf6c545a0f8b.png)

* なので安心して遊べます。


# おわりに
## まとめ
* 以上、TiDB の SaaS 環境である TiDB Cloud を、アカウント登録から基本設定を経て、FileMaker と ODBC 接続できるようにした上で、パフォーマンスの検証まで、リアルタイム的に試行錯誤しながら書いた記事でした。
* パフォーマンス検証においては、同じ SaaS で MySQL 互換性のある、今流行りの PlanetScale よりも良いパフォーマンスが出ていたというのが特徴的でしたね。本来の TiDB は単なる MySQL 互換目的で使われるべきものというわけではないのですが、このような用途でも実力が発揮されているということが分かりました。
* TiDB Cloud のフリー版は一年間という期限つきなので、本格的に導入しようかなと検討する場合には、以下ページで価格が確認できます。
  * 従量制なので、シミュレータがページ内にあると嬉しいですね。
  * そして今 ( 2022/10 時点 ) 円安なのがツラいところですね……

https://pingcap.co.jp/tidb-cloud-pricing-details/

## 雑感
* 個人的には管理画面がイイ感じだったのがとても魅力的でした。マネージドサービスの良いところですよね、ほんと。
* もし本記事で分かりにくいところがあれば、お気軽にコメント等でご質問いただけたらと思います🙏
* そもそも FileMaker Server 側のサーバスペックをもっと上げたら、もう少しパフォーマンスが上がるはずなので、いつか本番環境などで試してみたいところ。