みなさんMySQL使っていますか? インフラエンジニアの nobuh こと波多野です。
弊社はサーバー開発に携わることが多く、サーバー開発の言語としては PHP をはじめ C# などいろいろな言語を使っています。そのサーバーと合わせて必須となるデータベースについては MySQL ないし AWS RDS Aurora など MySQL 互換データベースを含め、ほぼ 100% MySQL を使っています。
そして、どんなサービスやプロダクトでもデータを管理し提供するデータベースは、性能でも重要な部分になります。
今回そんな MySQL の性能で重要となるインデックスについて、またクエリをチューニングする場合に必要となる EXPLAIN についての社内講習会を「新卒講義」の場を借りて実施いたしました。その内容について紹介したいと思います!
新卒講義とは
4月に入社した新入社員の面々は、全員集合しての教育を経て、8月の今は OJT で各チームに配属され現場で学んでいるところになります。
チーム内でより実践的に学んでいるところではありますが、人事担当の方から社会人としてのノウハウを伝えたり、幅広いテーマの教育を継続して提供する方法として週一回さまざまなオンライン講習会を行っています。また「新卒講義」という名前は付いていますが、せっかくの機会なので若手社員など社員が自由に参加可能なものとなっています。
今回その新卒講義の時間を2コマ頂きまして、MySQL のインデックスと EXPLAIN についてお話いたしました。
1日目「MySQL INDEX+EXPLAIN入門」
2011年の弊社の記事「ソーシャルゲーム開発者なら知っておきたい MySQL INDEX + EXPLAIN入門」ですが、今見てもこちらの資料がすばらしいため1日目はこの資料を活用して説明を行いました。
ポイントを紹介すると
- データの量が増えてもインデックスを使っていると一定の速度でアクセス出来る
- ただしインデックスが増えていくと、INSERT や UPDATE にかかる時間が増えていく
- (インデックスマージ等ありますが)原則 MySQL はインデックスを1個だけ使う
- インデックス1本で、複数列の値で条件を指定したいときにも使える「複合インデックス」がおすすめ
- 複合インデックスは列の順番が重要
となっています!
2日目「MySQL EXPLAIN 解説」
2日目は前述の資料の EXPLAIN の説明を補強して、より詳細に解説しました。
- MySQL は複数の入れ子のサブクエリの実行という形でクエリを処理している。EXPLAIN の id の行の一つ一つがそれに相当している。
- 繰り返し実行される部分的なサブクエリはキャッシュ(いわゆるクエリキャッシュとは違う機構です)されているとはいえ、対象行数 (row) は少ないのがベスト!
- 親のサブクエリの値に依存した子供のサブクエリは、実際に繰り返し実行が必要になるので特に要注意
などになります。
2日目は時間が少々足りなく、駆け足の説明となってしまいましたが、MySQL の深い世界の片鱗を感じ取ってもらえたと思います!
まとめ
弊社では、様々なサービスの性能の鍵となる、MySQL やデータベースに関心のあるエンジニアを歓迎しています。
興味のある方はぜひご応募してみてください!! ⇒ 採用情報