TiDB Cloudのチュートリアルやってみた

サクッとTiDB　Cloudのチュートリアルやってみました。

# 1. アカウントを作ります。
https://pingcap.co.jp/tidb/
<img width="400" alt="スクリーンショット 2024-08-04 16.28.20.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3361865/515ed386-3daa-f898-b505-363efa6a7e96.png">

右上の【無料で始める】をクリックしてアカウントを登録。
TiDB Cloud(TiDB Serverless)は無料枠が多くあるので基本的に無料で使えます。

# 2. チュートリアルを始める
<img width="400" alt="スクリーンショット 2024-08-04 16.27.12.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3361865/3e4028ba-f0e4-4e46-6b66-b334fe69a1f8.png">

右下の【？】をクリック。

# 3. データセットを選択する
https://pingcap.co.jp/tidb/
<img width="400" alt="スクリーンショット 2024-08-04 16.25.59.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3361865/1d1e065c-70e4-c1d3-f66e-2b50e2ed5b88.png">

使ってみたいデータセットをクリック。
今回は【Stream Game Stats】を選択。

# 4. データセットをimportする
https://pingcap.co.jp/tidb/
<img width="400" alt="スクリーンショット 2024-08-04 16.37.47.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3361865/d8d41da5-838f-0ebc-e397-9791ee03c14b.png">

【Import Dataset】をクリック。
待つこと数分…

# 5. データセットのimport完了
https://pingcap.co.jp/tidb/
<img width="400" alt="スクリーンショット 2024-08-04 17.24.43.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3361865/e4cea3aa-6046-2e37-4a1a-95e90f9b616f.png">

取り込めた！
【Start】をクリックで次に進む。

# 6. データセットの内容確認
https://pingcap.co.jp/tidb/
<img width="400" alt="スクリーンショット 2024-08-04 17.26.32.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3361865/55742939-0523-3936-9a77-a1b519e9f0f7.png">

なんと！親切にSQLが用意されている。
【Paste into SQL Editor】をクリックし、右上の【Run】をクリック。
https://pingcap.co.jp/tidb/
<img width="400" alt="スクリーンショット 2024-08-04 19.11.53.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3361865/c9356938-b425-8582-eb17-f670e706cef1.png">

データが表示された！

# 7. さらにデータセットの内容確認
https://pingcap.co.jp/tidb/
<img width="400" alt="スクリーンショット 2024-08-04 19.06.13.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3361865/6885c587-400c-b1a8-2686-3297a9a744fe.png">

<img width="400" alt="スクリーンショット 2024-08-04 19.06.36.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3361865/41b64ed0-c328-92b2-eed3-98fc19375ecc.png">

同様に実行してデータが表示されることを確認。

# 8. Text2SQLなるものを実施
<img width="400" alt="スクリーンショット 2024-08-04 19.07.10.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3361865/8507b2c5-4739-3cc1-2615-86a2269a8a04.png">

<img width="400" alt="スクリーンショット 2024-08-04 19.07.46.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3361865/78936c16-8820-90a4-bd39-24ac5bc1f2e6.png">

command + iで入力欄を表示させて、【Top 10 popular games】を貼り付ける。

<img width="400" alt="スクリーンショット 2024-08-04 19.08.39.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3361865/7e1d1c9d-7fe1-12fd-4585-78cb864be109.png">

SQLが生成されてる〜
（SQLを書かない未来がすぐそこに）

# 9. Applicationに接続
<img width="400" alt="スクリーンショット 2024-08-04 19.09.48.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3361865/54cde5f0-6c00-74a7-8883-1917f4c78f87.png">

https://steam-insight.vercel.app/
こんな感じでデータの可視化のアプリもできる！という紹介ページが見れます。

# 10. フィニッシュ
<img width="400" alt="スクリーンショット 2024-08-04 19.10.21.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3361865/1abfa4ed-bd56-abdb-dc82-384c279101e5.png">

お疲れ様でした。

# 応用編
OLAP系のSQLの場合TiFlashのストレージエンジンを読み込みます。
ただTiFlashが使われるのか、TiKV(OLTP系)が使われるかはオプティマイザ(TiDB)次第。
今回のSQLたちはどちらが使われることになるでしょうか？検証してしました。

## 準備
TiFlashを使うには事前にテーブル単位で設定が必要です。
そのため今回使うテーブルに対してTiFlashを使用する設定を行います。

```
-- TiFlashの使用状況を確認
select * from information_schema.tiflash_replica;
```
![スクリーンショット 2024-08-06 10.04.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3361865/67edfceb-edf3-6659-aa17-0fe55bef1480.png)
[empty set]なので使われてないことが確認できた。

```
-- game_genreテーブルをtiflashを使うように設定
alter table game_genre set tiflash replica 1;
```
![スクリーンショット 2024-08-06 10.06.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3361865/f3905118-7388-1e4d-e824-9a473d9043ec.png)
1つの複製は少なすぎるらしい…
```
-- game_genreテーブルをtiflashを使うように設定
alter table game_genre set tiflash replica 2
-- gamesテーブルをtiflashを使うように設定
alter table games set tiflash replica 2;
```
![スクリーンショット 2024-08-06 10.07.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3361865/f18315a6-7580-5ef1-2065-c0a49269c1b6.png)
成功！
```
-- TiFlashの使用状況を確認
select * from information_schema.tiflash_replica;
```
![スクリーンショット 2024-08-06 10.31.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3361865/99158828-f4e9-c6f0-5b24-14b49280e8b3.png)
成功！

## 検証結果
### TiFlash使用前
```
explain analyze
SELECT g.*
FROM game_genre gg
LEFT JOIN games g ON g.app_id = gg.app_id
WHERE gg.genre_id  = 9
ORDER BY g.estimated_owners DESC;
```
![スクリーンショット 2024-08-06 10.20.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3361865/5c4c782a-aa38-390b-2ccb-34fe023fd396.png)
task列のcop[tikv]になっているめtikvへアクセスされています。
処理時間は185msだと思われる。

### TiFlash使用後
TiFlashと使用前と同じSQLを実行。すると、、、
![スクリーンショット 2024-08-06 10.37.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3361865/48b89a5a-b175-1627-690d-b955ea5b268e.png)
cop[tiflash]ってなってる！これはtiflashが使われたと言うこと。

処理時間は227msだと思われるので、処理が全体としては遅くなっている…
このSQL自体もOLTPの方が適していそう

## 追加検証
もう少しOLAPで使われそうなSQLにて検証
```
explain analyze
With r AS (
    SELECT
        games.name,
        genre.genre_name,
        rank() over (partition by genre.genre_id order by games.metacritic_score desc) as ranking
    FROM game_genre gg
    LEFT JOIN genre ON genre.genre_id = gg.genre_id
    LEFT JOIN games ON games.app_id = gg.app_id
    WHERE games.metacritic_score != 0
)
SELECT *
FROM r
WHERE r.ranking <= 5;
```

### TiFlash使用前
![スクリーンショット 2024-08-06 10.22.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3361865/404129f2-29b1-3243-52ac-0004a711b2b5.png)
処理時間は189ms

### TiFlash使用後
![スクリーンショット 2024-08-06 10.38.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3361865/e693522d-eb55-827c-5a48-e637ca3220cf.png)
処理時間は281ms
うーん、遅くなった…
まぁ、データ量も多くはないししょうがないか？
game_genre：188,188レコード
games：68,223レコード

### 余談ですが①
```
alter table game_genre set tiflash replica 0;
alter table games set tiflash replica 0;
```
これでTiFlashをやめられます。

### 余談ですが②
TiKVとTiFlashの使い分けですが、SQL実行時にヒント句で与えられるみたい。
```
explain analyze
SELECT /*+ read_from_storage(tikv[game_genre],tiflash[games] */
       g.*
FROM game_genre gg
LEFT JOIN games g ON g.app_id = gg.app_id
WHERE gg.genre_id  = 9
ORDER BY g.estimated_owners DESC;
```
ちなみに上記SQL実行しましたが、tiflashが使われました。
エンジンの分離設定をする必要があるみたいですが、TiDB構成ファイルを触る必要があり、すぐにできなかったためここまでとします。

SQLでヒント句が与えられるのは良いですね。TiKvに影響を与えたくない状況は少なくないと思うので活用したいですね。

# 感想
将来は分析を考えつつ、今は業務アプリを作る状況って全然あると思うので、そんな時にTiDB良いですね。
もちろんMySQLのアプリを移行して、その後分析にも活用すると言うのもありですし。
Text2SQLも実装されていて新しさを感じました。
今後も期待！