ビギナーズセッション
今回は、ビギナーズセッションでの発表者は@studio3104_comさん1名でした。若干さみしいなーとは思ったものの、テーマが「データベース」ということもあって、質問すること自体が割りと難易度高めだったのかな、と反省しております。
※彼は事前に主宰にリンクまで送って、「こういうのでOKですか?」って訊いてくれてたにもかかわらず、僕のほうできちんと確認しきれないまま(要するにもちょっとソフトに!とかいうツッコミを入れないまま)OKだしちゃったので、その辺はまあなんと言うか、ごめんなさいです。。。
やりたいこと&質問事項を、掻い摘んで書き出すと、
やりたいこと
- MySQLのslow-logを監視して、slowなクエリを抜き出す
- use db_nameのようなDB変更クエリを元にDBを選択し、 抜き出されたslowクエリに関するEXPLAINを実行する
- 実行結果を別ログに吐き出す
質問事項
- DBがシャーディング(このブログが詳しい)されているので、異なるDBでもテーブル構造がまったく一緒だったりする。
- どのDBに関するslowクエリなのかを判断する方法が、知ってる限りuse db_name を見つけるくらいしかない。
- 特にプログラム起動直後は、use db_name が見当たらないケースが発生するので、DBの特定方法でもっと良い方法は無いだろうか。
というもので、ものすごくガチではないものの、beginner向けとしてはなかなかパワーのある内容でした。
ある程度質問内容を噛み砕いて説明した甲斐もあって、聴衆からはさまざまな意見が出てきました。最初のほうは、
「クエリのコメントにDB名を書いておけばログにコメントが出てくるんじゃないのか?(実際はログに載らなかったのでダメ)」
「当たり障りのないwhere文にDB名を書くのはどうか?(一同爆笑。クエリに手を加えられないのでNG)」
「プログラム側で各DBのスキーマを持っておいて、クエリ内のテーブル名を元にスキーマを漁り、DB名を持ってくるのはどうか?(シャーディングのものがあるので、あまり意味が無い)」
というバッドノウハウかつ、あまり効果の期待できないものが色々挙げられたのですが、クエリを発行するシステムがwebアプリということもあって、最終的には
「EXPLAINを行う直前に、どのDBを使っているのかを問い合わせる別のwebアプリを用意し、間に挟みこむ」
という方法がベターであろうという話になりました。
あと細かいところで、
my ($foo) = $str =~ /^foo:(\w+)/ if $x;
のような書き方は$fooがそもそも定義されないケースがある(modperl)ので、オススメできない、という意見もありました。
ちなみに@studio3104_comさんは、perlは3ヶ月くらいしか触っていないとのことでしたが、ほかの言語の経験がかなり豊富な様子でした。
※本人曰く「「他の言語は経験豊富」は誤報です!!! 他の言語はHello Worldしか出来ませんー 」だそうです。そんなまさかーw
※本人曰く「「他の言語は経験豊富」は誤報です!!! 他の言語はHello Worldしか出来ませんー 」だそうです。そんなまさかーw
休憩
ライトニングトークまでの10分間、休憩をはさみました。その間も、一部では先ほどのDB名特定について議論していたり、主宰による雑多な質疑応答を交えたりしました。
ライトニングトーク
ライトニングトークの一発目は、主宰による「Perl暦およそ10年(?)の僕がデータベースを使えるようになるまでの昔話」と題して、過去の恥さらしとORマッパー利用遍歴の紹介を行いました。(スライドはこちら)
言いたかったこととしては、DBI+MySQLにまず慣れよう。ORマッパーはその後でいい、ということですね。
続いて@maka2_donzokoさんのLT。手始めに自己紹介として「薄い本作っています」と言いながら「Acme大全」や「Parumon」の宣伝を行った後、「MySQL使ってる方ー(多数挙手)」「PostgreSQL使ってる方いますか?(2~3名挙手)」「僕もPostgreSQL使ってますけど。少ないですねー」という感じで、いろんなデータベースがありますね的な話をしてたところ、突然スライドの題字「データベース」がもぞもぞ動き出し、いつの間にか「ダースベーダ」になってしまい、下の写真のように。。。
さらに、これだけだとPerlとの関連性が薄いのでという理由で、Perlにはsort()などで登場する「スターシップ演算子 <=>」があるよ(ベイダー卿が<=>に搭乗している!?)という話と、CPANモジュールの1つ、Lingua::Alphabet::Phonetic::StarWarsを使って、ベイダー卿(Vader)が"LOVE"の中に居るんだよ、という話で締めくくりました。まかまかしい!
3人目は@toku_bassさんによるMySQL::Diffの紹介です。開発->検証->本番という3つの環境について、DBのテーブル構造をあわせたい、という、おそらくある程度経験を積んだ開発者なら誰もが思い悩む部分を、「diffをつかってpatchを作るかの如く」解決してしまおう、というものとのこと。
本番DBと開発DBが異なる、という割とカオスな状況は往々にして遭遇する状況ですので、このようなツールの存在はとてもありがたいですね。
最後のLTを務める@hirobanexさんは、Beginner向けにTengを紹介してくれました。
DBIをある程度使えるようになった後は、開発効率を劇的に向上してくれるORマッパーを使いたくなるだろうということで、「作者が日本人」で「割と広く使われており」「そのため日本語で質問しやすい」という感じの利点を前面にTengをオススメしていました。
あと、素のDBIではどうしてもセレクト系メソッドがたくさんあって、Beginner的には混乱しそう、ということもあって、このあたりの事を考えなくてもよいTengのお手軽さをアピール。
「Tengのdoわかりやすいね。」という感想が出るほど、良さが伝わった様です。
ブルガリア料理のお店で懇親会の様子
※何度も言いますが、ガチホモ合コンではありません!!!11(こことか)
写真持ってる人、居たらシェアしてくださいね!
ブルガリアンカクテルは、飲んでるときはそんなに強いと思わなかったけど、後でものすごい酔いが回って、かえる頃には見事なヨッパライになっておりました。。。