tuningathon#5 でやったこと

Tuningathonに参加してきました。
http://www.zusaar.com/event/467009

きっかけ

Tuningathonの前々日くらいに@himajin315に誘われたのがきっかけです。
どんなことするのかよく分かっていない状態でいつものノリで了解して当日を迎えました。

ハプニング

大学で待ち合わせたのですが、開始時間を間違えるというハプニング。
・自分でもちゃんと確認しなかったのが悪いのですが、ペアの人が12時受付かと思ってた。
・大学から30~40分はかかる。
・大学を11:40分くらいに出た。
遅刻でした…。#moukaeritaiJPが頭に浮かびます。

向かってる途中に #tuningathon でTwitter見てたら「始まった!」みたいに書いてる人が多くて「え、早くない!?」と思いそこでzusaar確認して気付きました…。
以後、気をつけます…。
サテライト向かうまででレギュレーション読んでました。MySQL。
「今日は諦めない気持ちしか持ってきてない。」と呟いてる時点で気合い十分。 #moukaeritaiJP

http://twitter.com/y0t4/status/292466127160889344
http://twitter.com/y0t4/status/292466413560549376

到着

沖縄サテライトに到着してからはお腹も空いてたので、sshして/proc/{cpu,mem}infoを確認した後ピザ、ポテトもぐもぐファンタごくごく。
これが欧米文化かぁ、なんて思いながら初のMySQLチューニング。

適当に$HOME以下を確認して計測スクリプト動かしてみると168.41320014秒
おっそい。ペアの人は初回157秒だったそうです。何もしてないのに負けた。

会場はなんか黙々と作業してる雰囲気だったので隣にいるにも関わらずSkype使って報告しあってました。(後半は普通に話してた)
今思えばログ残るから良かったのかな。

方針として、僕がMySQLチューニング、ペアの人がMySQLのsource installという感じに。
この時点で12:40。

チューニング開始

Skypeにあった途中経過を全部貼ってみます
計測時間 計測結果
13:10 28.6917150021秒
13:33 23.7787659168秒
14:34 20.9666309357秒
14:34 10.3262760639秒
14:52 14.7098088264秒
Skypeのログはここで途切れてました。(報告はSkype上でやればよかったかも?)

14:34に10秒とか出てますが、これはmysqld restartした直後の値ではなく、2回目の値です。
キャッシュのせい?早い。
それ以外は律儀に計測する前にrestartしてました。
(このときはmy.cnfいじってたから)

ここからmy.cnfの設定はほとんどいじってないのでその設定貼っておきます。
innodb_buffer_pool_size=12884901888
key_buffer_size=268435456
innodb_flush_log_at_trx_commit=2
query_cache_size=1048576
thread_cache_size=2097152
sort_buffer_size=4194304
read_rnd_buffer_size=2097152
2^20くらいまでは覚えてますよね。(ニッコリ)…いや、M使えよ。

最初に/proc/meminfo確認してかなりメモリは潤沢なのを知っていたのでガンガン振ってます。
始めにちらっとQuery見てsortとかしてたので、google先生で確認しながら必要そうかな、って思ったのに振りまくりました。

ここからようやくベンチマークscriptのQueryをまともに見ました(遅い…)
join…order by…group by…
とりあえず復習がてら全てググり直し。…INDEXいじっていいんですか。はい。

使ってるテーブルはpageとrevisionの2つだけだったので、show indexesしてindexについてぐぐってました。
そんな中Twitter見ると「INDEX消すと早くなるよ!」ってあったのでとりあえずプライマリ以外全消し。
おー、ほんとに早い。
適当な場所にインデックス貼ってみてまた少し早くなりました。

ここで途中経過。まさかの2位。テンション上がりました。(確かこのときは9秒台)

その後は複合インデックスとかインデックス作る順番とかインデックスのDESCとかいろいろ設定して7.57秒。
最初の160秒超えはなんだったんだ状態。
そんなこんなでタイムアップ。

結果

結果は6位。7.622秒でした。途中で2位とか見ちゃったんで、悔しい…。
沖縄勢のランキング入りにはびっくりしました。多い〜。
トップは6秒…早過ぎ。主キーなんて思いつかなかった。

その後はお菓子やら食べて、周りの人の話聞いてました。
RESET QUERY CACHE無視するとか全く考えつきませんでした。
こういう発想ができて実現できる人になりたいですね。
まだまだ自分の勉強不足を実感した日でした。

ちなみにインデックスは下記の通りです。
mysql> alter table revision add index (rev_user desc, rev_timestamp, rev_page);
mysql> alter table page add index (page_namespace, page_is_redirect, page_touched desc);

MySQLというかデータベースの勉強をしてた時間ですね。
こういうイベントは集中してやる時間になるので定期的にあるとモチベーションの維持ができますね。

スゴく楽しかったし勉強になったので次回も時間が合えば参加します。