#perlbeginners に行ってきた!
ガチホモ合コンとして有名な、Perl Beginners #3 : ATND に参加させて頂きました。
開催3日前にビギナーズセッションの1枠をいただくことになったのですが、3枠分を突貫し、終始俺のターン状態になってしまいました。。
○○Casual、○○Beginners ってだいたい詐欺だから、そのノリで参加したのが過ちでした。MySQL界の悪影響ですねぇ。
発表に至る経緯
fluent-plugin-mysqlslowqueryをちょっと使ってみようとしていました。
スロークエリログをただパースして取ってくるだけではなく、EXPLAINも自動でしてくれたらイケてるなぁと思ったので、じゃあout_exec_filter使って、流れてくるSQLをEXPLAINさせてみようと考えました。
perlで書けばperl beginnersでレビュしてもらえるかも!
と思ったので、@ytnobodyさんに聞いてみたら・・・
#perlbeginners ビギナーズセッション URL の発表者がいないけど、俺の書いたクソコードをマッチョな皆さんにレビュしていただくみたいな感じでいいなら発表者登録したいなどうなのでしょう? @ytnobody
@studio3104_com そういうのをむしろまってました! #perlbeginners
相談したかったこと
複数データベースが同居しているmysqldだと、どのデータベースにEXPLAINしたらいいかわからない。
例えばシャーディングされたデータベースを、サーバ削減により、1台のサーバにがっちゃんこしたような場合は、同じスキーマを持つデータベースを複数持つことになってしまいます。
スロークエリログには、異なるデータベースでのスロークエリが発生したとき、「use DATABASE」が挿入されますが、生ログを遡って、最後の「use DATABASE」を取得するということはなんとなくスマートじゃないなぁと思ってやりたくなかったのですねぇ。
ステータス変数とかで最後にスロークエリを吐いたのがどのデータベースへのクエリだったのかとかわかれば・・・という感じで悩んでました。
いろいろアドバイスをいただいた
いろいろとアドバイスをいただきましたが、自分にはハードルが高かったり、コストが高くついちゃうかなぁというものが多かったです。
ので、@penguinJr1さんのご意見を採用させて頂きました。ちょっと強引ですが、作為的(カジュアル)にスロークエリを発生させるというものですねぇ。
(こんなことしたらイスが飛んできちゃうかも知れないけど・・・ 他にカジュアルでいい方法あれば教えてください・・・)
アプリ側のコードに手を入れられるのであれば、DBIx::QueryLog - search.cpan.orgとか超イケてるなぁと思いました。
コード一部抜粋
my $long_query_time = $handler->dbh->selectrow_array("select VARIABLE_VALUE from GLOBAL_VARIABLES where VARIABLE_NAME = 'LONG_QUERY_TIME'"); $handler->dbh->do("SELECT SLEEP($long_query_time)");
コード全部
https://github.com/studio3104/out-exec-mysql-slowquery/blob/master/explain2.pl
嬉しかったこと
勉強会全体の雰囲気がとても素晴らしかった。
- 発表者の発言が、「それビギナーにわかるか?」って感じになってくると、@ytnobodyさんが都度解説を入れられていたので、ついてこられなくてポカーンな人が少なかったんじゃないでしょうか。自分の発表時には、それにかなり助けられました。。
- アドバイスや質問がガンガン飛び交っていて、参加者の貪欲っぷりが気持ちよかった。
充実のアフターケア
- 発表直後に、@maka2_donzokoさんが「ココはこういう書き方のほうがいいよ」といろいろと教えてくださった。
- @toku_bassさんが、俺のクソコードを見通しよく書き換えてくれた。大変勉強になった。https://github.com/tokubass/out-exec-mysql-slowquery/blob/master/explain2.pl
感想
とても素晴らしい勉強会でした。次回も参加したいです。
コンセプトを思いっきり無視してしまい、空気読まない発表をしてしまいましたことを猛省・・・
ココに書いてあるような、ベテランとビギナーのペアプロハッカソンとか超絶おもしろそうなのでやってみたいなぁ。
発表資料
内容は薄いですが一応発表資料を公開しておきます。