自由帳

とりとめのない学習メモです。主に Web サービスのシステム基盤や運用に関することを書いています

MyNA会(日本MySQLユーザ会) 2013年3月 へ参加してきました

はじめに

MyNA会(日本MySQLユーザ会) 2013年3月 へ参加してきました。

私はDBエンジニアというわけではありませんが、最近MySQLデータベースをさわりはじめたので、いきなりはハードルが高いかと思いながらも少しでも勉強になればと思い参加させていただきました。
以下は、復習を兼ねた自分なりのメモや追加でほんの少し調べてみたことなどのまとめです。

セミナー概要

上記リンク先に記載されていますが、当日の内容は以下の通りでした。
セッション
発表者 タイトル
平塚様(@sh2nd) チューニンガソン5の復習 MySQL 5.6 新機能編
yoku様(@yoku0825) 意外と話題に上がらない、mysqld以外の5.6新機能
奥野様(@nippondanji) MySQL 5.6 新機能(熱)
ライトニングトーク
発表者 タイトル
木村様(@meijik) performance_schemaとinformation_schemaを5分で語る
梶山様(@RKajiyama) MySQL Connect 2013
木下様 特別登壇

講演

平塚様:チューニンガソン5の復習 MySQL 5.6 新機能編

MySQLOracle Aceとなられた平塚様のお話。
チューニンガソン5の内容について振り返り後、チューニンガソンで登場した6種類のクエリに対して、MySQL5.6でのチューニング手法、ノウハウを御紹介いただきました。 資料が公開されていますのでそれを見ていただくのが良いのは間違いないですが、自身のメモ/復習のために以下に内容をまとめておきます。

チューニング内容
MySQL5.6へのアップデート

MySQL 5.6ではパフォーマンススキーマがデフォルトで有効になっていることやメタデータロックの仕組みにCPUスケーラビリティがないことが原因で、MySQL 5.5より性能面が低下しているとのことでした。

インデックスの追加 - Optimizer Traceの利用

チューニングとしては、Covering Indexなどインデックスの張り方の見直しを実施されてましたが、オプティマイザの判断によってはIndexを利用されないケースもあるようです。そういった際にはMySQL 5.6の新機能であるOptimizer Traceという機能でオプティマイザの内部動作を確認できるそうです。
ただ、Optimizer TraceはJSON形式で数百行も出力される上にマニュアルがないので、読むのは慣れ…

オプティマイザの精度向上(レンジ分析範囲の修正)/ヒューリスティクスの排除

上述の、"オプティマイザがインデックスを利用しない実行計画を選ぶ"といったような良くない判断をする原因として、InnoDBでの"インデックスに保存されているレコードの読み取り数の見積もり方が良くない"とのこと。InnoDBは読み取るレコード数をコスト計算に利用し、インデックス内の読み取りレコード数を11ページのリーフページで見積もる動作であり、今回のように大量のデータに対するクエリでは、読み取りレコード数の見積もりが正確ではなかったため、インデックスを利用した場合のコストが大きいとオプティマイザが判断したようです。
平塚様がちょっとだけ本気を出されてInnoDBのソースから、InnoDBのレンジ分析の精度をあげるためにアクセスするリーフページ数の割合を本来の10倍に変更したり、ヒューリスティックアルゴリズムを除去する修正をされていました。

オプティマイザ・ヒントの付与

STRAIGHT_JOINを使ってJOINの順序を強制し、Force Indexを使って利用するインデックスを強制することで、クエリにLoose Index Scanという手法を用いるようにしていました。

サブクエリのマテリアライゼーション

サブクエリに対して中間テーブルを用いることで、クエリを高速化する手法を用いられていますが、バッドノウハウとのこと。 マテリアライゼーションは、tmp_table_sizeの値までのデータであればMEMORYストレージエンジンが用いられるそうですが、tmp_table_sizeの値を越えるデータ量になると、MyISAMストレージエンジン(つまりディスク上)に切り替わるようです。tmp_table_sizeで収まる場合はメモリ内でデータが処理できるので効果があるとのこと。

テーブルの非正規化

大量のレコードを処理するクエリに対しては、テーブルの非正規化を行うことで高い効果を得られるそうです。

yoku様:意外と話題に上がらない、mysqld以外の5.6新機能

mysql_install_db, mysql_config_editor, mysqlbinlogを中心としたMySQL付属ツールの御紹介。 この辺りのツールやユーティリティはまだきちんと使ったことがないものばかりだったので今後調べて使ってみようと思ってます。

mysql_install_db

MySQLを初期化するプログラム。rpmインストール時には最後に自動で実行されます。 MySQL5.6では--random-passwordsオプションにより初期ランダムパスワードが設定されるようになっていたり、パスワードの有効期限(password_expired)設定が有効になっていたりとセキュリティ面を考慮したような変更点があるそうです。 あと、my.cnfの作成先が/etc/my.cnfから$MySQL_DATA(RPMインストール時の標準は/usr/share/mysql)/my.cnfに変わったようです。

mysql_config_editor

これもセキュリティ面の改善となるのでしょうか。MySQL 5.6からmysql_config_editorというコマンドを使用して、.mylogin.cnfというファイルにパスワードを暗号化して保存できるようになったとのこと。

mysqlbinlog

MySQLサーバが生成するバイナリログをテキスト形式で確認するツール。
--read-from-remote-master, --stop-never, --row, --result-file といった様々なオプションが登場しましたが、mysqlbinlog自体を使ったことも無い身としては追いきれませんでしたので、別途調べていきたいと思います。

奥野様:MySQL 5.6 新機能(熱)

プロプライエタリなディスプレイドライバがうまく動作しなかったようで、プロジェクタに映像が出ないというトラブルがあり、木村様のPCを借りられてのスタートだった模様。 MySQLの歴史についてのお話から始まり、「5.6の新機能紹介」のデモ…の予定でしたが、上述のトラブルにより事前に御準備いただいていたデモ環境が利用できない状態だったため、その場でMySQL SandBoxという複数のMySQL環境を手軽に構築できるツールを利用しての環境作成から行われていました。

MySQL SandBoxのことは知りませんでしたが、CPAN経由でのインストールが容易にインストールできるようです。 利用したいMySQLソースコードを取得し、シェルの環境変数を一つ設定して、make_sandboxコマンドでMySQLのビルドを行えばMySQL SandBoxでのMySQLインストールが可能なようで、ポートはMySQLのバージョンに応じて自動で決定されるようなので、容易に複数のバージョンをインストールして試すといったことができるようです。

時間の都合もあり、予定していたデモを全て実施いただけなかったため、当日実施予定だったデモの内容は改めてYoutubeに公開いただけるそうです。楽しみです。
また、MySQL5.6の新機能については昨年のdb tech showcase 2012の資料が奥野様のSlideShareへ公開されておりました。

LT(ライトニングトーク)

木村様:performance_schemaとinformation_schemaを5分で語る

ps_helperというものを用いたperformance_schema(統計情報)の解析についてのお話。 まだ使い方はよく分かりませんが、以下のリンクを見ると図が作成できたりと面白そうでした。

執筆された下記書籍をじゃんけん大会の商品として提供していただき、見事に勝ち残られた方は和歌山からいらっしゃった方でした。

梶山様:MySQL Connect 2013

今秋(9月)にサンフランシスコで開催されるMySQL Connect 2013についてのお話。当日の講演者を募集されているそうです。 参加するには敷居が高い…

MySQLのnode.js APIなどについてもちらほら…

木下様:特別登壇

前述のトラブルの影響もあって、InnoDBの開発者である木下様の登壇のお時間がありました。

最初のセッションでの平塚様のInnoDBに関する指摘のあとでの登壇でしたが、むしろ今後のInnoDBの伸びしろを感じてほしいとのこと!
MySQL5.6がリリースされて、MySQL5.7にも取り組んでいるそうですが、公式アナウンスが無い現状では話せることがないそうです。

司会の坂井様とのやり取り(漫談?)も面白かったです。

おわりに

MySQLに限った話ではないと思いますが、こういったセミナーでいろいろなお話を聞くと、やはりそのソフトウェアなりアプリケーションなりの仕組みを理解するというのは重要だということを思います。
MySQLだと、SQLがどのように動作するか、オプティマイザがどういう判断をするか、ストレージエンジンがどういう仕組みになっているか、どういう機能があってどういうことが出来るのか等々。使い込まないと見えてこない部分もたくさんあると思うので、理解を深めるためには積極的にいろいろ使っていければと思います。 ソースコードが参照可能なので、そのレベルで理解して対応できれば最高なんでしょうけど、MySQL初心者の私にとっては凄いテクニックも様々な有効な機能もまだ理解しきれない部分が多々あったので、とりあえず聞いたことを噛み砕いて整理している段階ですが…

最後になりましたが、スタッフの皆様、スピーカー/登壇者の皆様、貴重なお話を誠にありがとうございました。

参考

公開いただいている当日の発表資料をしっかり読み返したいと思います。

セミナー資料
Togetter