👾

クエリチューニングを簡単に試せるハンズオン環境「SeekQueryLab」を作ったよ

2024/03/04に公開

これはなに

ども、レバテック開発部のもりたです。
クエリチューニングを学ぶとき、環境を作るのがとにかく面倒なんですが、そこんところをショートカットしてクエリチューニングの練習ができる環境を作りました。今回はそのご紹介です。
なお対象はMySQLです。

概要

こちらのリポジトリをクローンしてローカルのDockerで動かせます。

https://github.com/mconfjp/SeekQueryLab

立ち上げ方等はREADMEにも書いてありますが、コンテナを立ち上げるとテーブルデータが入った状態で立ち上がります。改善可能なクエリが40本くらい用意してあるので、それのチューニングをして楽しいな、みたいな使い方を想定しています。書籍などでクエリチューニングの仕方自体は学んだんだけど、試す環境がないなあという方向けです。

動機と狙い

なんのために作ったのかということも整理しておきたいんですが、RDB周りの勉強をしていて、ハンズオン系教材が少ないなと感じたのが発端です。Webフレームワークの勉強とかならとりあえず作って覚えるのが鉄板かと思うんですが、データベースだとあまりそういう印象がないです。その要因のひとつはデータベースの実務が運用よりになることが多いためだと思っていて、じゃあ運用できる環境を作ってあげればいいじゃん、と考えて作りました。

できることとできないこと

できることとできないことは以下の通りです。

  • できる
    • EXPLAINで実行計画を見て、クエリをチューニングする
  • できない
    • いちからSQLの書き方を学ぶ
    • (DB以外のレイヤーを含んだ)総合的なWebパフォーマンスチューニング

使い方

では、具体的な使い方やフォルダの構成について解説していきます。

環境構築

前提として、gitとdockerが利用できるものとします。

  • リポジトリをローカルの適当な場所にクローンする
    • git clone https://github.com/mconfjp/SeekQueryLab.git
  • 初期化スクリプト実行
    • sh init_copy.sh
  • docker起動
    • docker compose up --build
    • 300万行くらい作ってるのでめちゃくちゃ重たいです。10分とかかかる(insertをチューニングしたい、してくれ)
  • MySQLにログインして動かしてみる
    • .envにユーザー情報あります

フォルダ構成

フォルダ構成はこんな感じです。

.
├── LICENSE
├── README.md
├── docker
│   ├── init
│   │   ├── init.sh
│   │   └── query
│   │       ├── after_insert_datum.sql
│   │       ├── insert_datum.sql
│   │       ├── make_tbl.sql
│   │       └── pre_insert_datum.sql
│   └── mysql
│       └── my.cnf
├── docker-compose.yml
├── domain
│   └── request.sql
├── init_copy.sh
├── logs
│   ├── mysql-error.log
│   ├── mysql-query.log
│   └── mysql-slow.log
└── work
    └── request.sql

dockerファイル内にテーブル作成、データ生成のSQLが全て入っています。これらはdocker containerを起動した際に自動的に流され、ランダムなデータが生成されます。データを初期化したいときはdocker volume rmでデータベースのデータを消して再度docker compose up --buildしてください。

サンプルシステム概要・テーブル構成・機能の一例

小説投稿サイトのシステムを想定しています。ユーザー数は3万人、投稿作品数は3万作品としました。ここらへんの数字は大きすぎるとセットアップに時間がかかってしまうので適当な規模にしています。

小さいですがテーブルのER図はこんな感じ。

機能は色々あると思いますが、今回クエリチューニングの対象として重ための処理をいくつか用意しています。例えばトレンド作品やランキングとかは割と集計が重たくなるため、チューニングのしがいがありますね。

リポジトリの権利関係

もりたの趣味リポジトリなので、どんな組織・個人が使っても問題ありません。ただ、使ってみたよとか一言もらえるともりたがメンテを頑張るのでお互いwin-winだと思います。

何か不具合とか要望があればGithubのissueを立ててください。それなりの感じで対応します。

今後の更新予定

まだちょっと整備できる箇所があると思うので、以下の通り更新できればと考えています。

おわりに

今回はクエリチューニング環境のご紹介でした。自分で使ってみての感想なんですが、実行計画を読む良い練習になってるなあと感じます。よければ皆さんも使ってみて感想を教えてください。PRやissue、その他リアクションがあるともりたが嬉しくなってメンテを頑張ります。

レバテック開発部

Discussion