こんにちは!エンジニアの福間(fkm_y)です。 弊社でデータベースの技術顧問をして頂いている三谷(mita2)さんに、MySQL5.7の追加機能についての開発部向け勉強会を実施いただきましたのでそのレポートをお伝えします。
開催背景
弊社では三谷さんによるデータベース勉強会を定期的に開催しており、3月にもMySQLロックの基礎編の勉強会を開催しました。
ANDPADでは、今年の4月にAurora MySQLをVer.1(MySQL5.6互換)からVer.2(5.7互換)にバージョンアップを実施しました。 tech.andpad.co.jp
Aurora MySQL Ver.2 になることで使えるようになった、MySQL5.7で追加された機能について開発者に知ってもらい、普段の開発に取り入れてもらうためにMySQL5.7の勉強会を開催することとしました。
今回は追加された150以上の新機能の中から開発者が知っておくと良いものをピックアップして紹介いただきました。
概要
- MySQL / Auroraのバージョンについて
- Server Side Statement Timeoutについて
- Performance Schema の強化 と sys Schemaについて
- Generated Columnについて
- 全文検索について
- JSON型について
- まとめ
MySQL / Auroraのバージョンについて
始めにMySQLのバージョンの見方やMySQLとAuroraのバージョンの対応関係について説明いただきました。 注意点として、MySQLとAuroraのメジャーバージョンに1対1の関係がありますが、マイナーバージョンには1対1の関係はありません。
MySQLはリリースされてから8年サポートされます。AuroraはMySQLがリリースされてから2,3年後にリリースされます。それに伴いサポート期限も伸びています。
Server Side Statement Timeoutについて
Server Side Statement Timeout を使ってSELECT文にタイムアウトを設定できるようになりました。max_execution_time
をSETで指定する方法とOptimizer Hint を使う方法があります。
Aurora Ver.2 ではmax_execution_time
の Optimizer Hint が未サポートのため、SETで指定する方法を使う必要があります。
Performance Schema の強化 と sys Schemaについて
v5.5から入った機能にPerformance Schemaがあります。クエリ実行時間やロックの状態などパフォーマンスに関することを確認できます。
ただPerformance Schemaは読み難いのでsys Schemaを使うと読みやすいフォーマットに変えてくれます。MySQL5.7からはこのsys Schemaがデフォルトでバンドルされるようになり、またALTER TABLEの進捗のモニタリング、トランザクションレベルの統計が見れるようになりました。
Performance Schema と sys Schema の便利なSchemaを紹介いただきました。各Schemaの見るべき要所、ユースケースを事例を交えながら丁寧に解説していただきました。
- sys.statement_analysis
- クエリ分析に用いられます。実行回数やフルスキャンの実行有無、平均レイテンシなどを確認できます。
- sys.schema_unused_indexes
- 利用されていないインデックスを確認できます。
- 注意点として、マスターのみレプリカのみで発行されるクエリもあるため全てのDBサーバを確認する必要があります。
- sys.schema_redundant_indexes
- 冗長なインデックスを確認できます。
- performance_schema.events_stages_current
- ALTER TABLEの進捗をモニタリングできます。
Generated Columnについて
Generated Column は他カラムの値を元に、式によってカラムの値を生成できる機能です。
Generated Column のデータの持ち方のオプションには「VIRTUAL」と「STORED」の2種類があります。
- 「VIRTUAL」は生成した値をデータファイルに書き込まず、参照時に都度計算式を適用します。
- 「STORED」は更新時に値をデータファイルに書き込むため、参照の度に計算式を適用する必要がありません。ですがその分、容量が増加してしまいます。
注意点としてはインデックスは「VIRTUAL」「STORED」に関係なくデータファイルに書き込まれます。
それらを踏まえたGenerated Columnを活用したチューニング例も紹介いただきました。
※チューニング例は後述のスライドの中に載っています。
全文検索について
全文検索のパーサーのMecabとN-gramがMySQL5.6までは日本語は未サポートでしたが、MySQL5.7からは日本語が使えるようになりました。 今回は単純な文字列マッチに絞って解説いただきました。
全文検索インデックスがなくても、前方一致はインデックスが利用できていましたが、後方一致と中間一致はインデックスが利用できず遅くなっていました。全文検索インデックスを活用すれば後方一致と中間一致を高速化できるようになりました。
全文検索インデックスの作成・使用方法や注意事項について解説いただきました。 MySQLの全文検索は全文検索専門のDBには劣るのでよく考えて使う必要があります。エンドユーザー向けではなく、補助ツールや社内向けに使うのがよさそうです。
JSON型について
JSON専用の型とJSON関数が使えるようになりました。 JSON型ではテキスト型と比較するとバリデーションや最適化をしてくれます。
Generated Column との合わせ技についても紹介いただきましたが、こちらは後述のスライドで詳細が説明されていますのでそちらを参照ください。
JSONをMySQLに保存するメリット・デメリットについても解説いただきました。
DynamoDBなど他のデータベースに保存するケースと比較してデータを一箇所で管理できることやスキーマレスで複雑な構造データを簡単に扱えることや、複雑なデータを正規化し分解したケースと比較してパフォーマンス面で有利になるメリットがあります。ただしスキーマレスのため、外部キーやユニーク制約などの制約が使えなくなることでデータの整合性を担保することが困難となりRDBの良さが失われるデメリットがあります。
JSON型の利用はメリットだけでなくデメリットを理解した上で利用する必要があります。
まとめ
いずれも丁寧な解説をしていただいたのですが、特にSys SchemaとGenerated Columnで誤解していたことや活用していない機能を知ることが出来、とても参考になりました。
Sys Schemaで活用できていない機能を使ってインデックスの再整理をすると共に開発者でも気軽に確認できる仕組みを作りたいなと思いました。またJSON型を既に活用しているプロダクトもありますが、この勉強会を機に活用を始めるプロダクトも増えそうです。今までは都度レビューで注意点を説明していましたが、この勉強会のおかげで説明する機会も減りそうです。
当日の資料
勉強会で使用された三谷さんのスライドはこちらになります。
さいごに
MySQL5.7追加機能の勉強会の紹介をさせていただきましたが、次はMySQL8.0の新機能の勉強会が開催できるように Aurora MySQL Ver.3 にバージョンアップしたいと思っています!圧倒的成長を続けるプロダクトのDBバージョンアップ、運用、チューニングに興味のある方、是非私たちと一緒に研鑽を積み重ねましょう!
データベース勉強会に限らず社内社外問わず勉強会を開催しているアンドパッドについて「取り敢えず話だけでも聞いてみたい!」人向けにカジュアル面談の制度もありますので是非話だけでも聞きに来てみてください。
過去開催されたデータベース勉強会レポート
追記(2022.08.03)
タイトルと内容が合っていないという指摘があったので、タイトルを「150以上の新機能が追加されたMySQL5.7の押さえるべきポイントについて勉強会を開催しました!」から「Auroraバージョンアップに伴い改めてMySQL5.7の押さえるべきポイントについて勉強会を開催しました!」へ訂正させていただきました。