なんか色々と資料散らかってるわ忘れてるわで、散々と面倒だったので。
後で付け足す前提で、手元にある「散らかった資料」を整理してまとめておきます的なmemo。
…あぁ先に。set globalとかは「すげぇ激しいパーミッション」が要求されるのでご注意のほどを。
具体的には「SUPER」っちゅぅのが必要です。GRANTで適当に設定しといてちょ。
まず、ログ系の状況の確認。
show variables like 'log%';
特に「重いクエリ」周りの確認。
show global variables like 'slow_query_log'; -- slow_query_log出す? 出さない? show global variables like 'long_query_time'; -- 何秒以上を「遅い」とする? show global variables like 'min_examined_row_limit'; -- 「すんげい大量のレコードを求めるクエリ」の大量っておいくつ?
で、コンソールから動的に設定。
set global slow_query_log_file = 'slow_query_logの吐き出し先を指定'; set global long_query_time = 2; -- とりあえず2秒 set global slow_query_log = 1; -- slow log開始!
ちなみに秒数は、小数点とか使えるようになったぽ by 5.1以降。
とりあえずこれ仕込んで「重いクエリ」を探し出しませう。
ただ、もう一つ「なんか細かいけど鬼のようにクエリ投げてる的な?」っていうボトルネックがあるので。
こんな手順で発見。
まずは「全クエリ」を引っ掛けるために、こんな設定。
set global long_query_time = 0;
次に「重いと思われるPage」にアクセス、クエリログを溜め込む。
てけとうに溜め込んだら
set global long_query_time = 2;
とかで一端元に戻す。
そのあと「mysqldumpslow」を使う。これで「似たようなSQL」をカウントしてくれる!!
実際にはこんな感じ。path切れてなかったらてけとうに探すこと。
mysqldumpslow -s t slowログファイル名 mysqldumpslow -s at slowログファイル名
optionがtなのかatなのかは、なんかよくわからなかった。ドッチでも、とりあえず目的は達成できたので、あんまり気にしてないw
これで「ほんのわずかなPageアクセス」で「驚くほど大量のクエリ」があったら、色々と絞殺ぢゃなくて考察をしてみませう。
memcachedとか、こゆときいいよねぇ。MagicWeaponはmemcachedとの相性が「ある程度」いいと思ってるんだけど、他のFrameWorkってどうなんだべさ?
あとは「index使ってない悪い子」を探すあたり。
show global variables like '%indexes'; set global log_queries_not_using_indexes = on;
ついでに、クエリの「受け入れ長さ」の確認と設定変更。
set max_allowed_packet = 1024*1024*32(計算して変換してね); show variables like 'max_allowed_packet';
思い出したり掘り出したり発掘したりしたら、追記予定。
追記 2012-02-14
set global long_query_time = 2;
やると、いったん「show global variables like 'slow_query_log';」が、OFFになるらしい。注意。
追記の追記。これ、誤認かもしれない。確認して、確認取れた人おしえてたも〜。
あと「現在滞留中」のクエリ状況とかを見るなら
SHOW PROCESSLIST; -- 長いクエリは省略表示 SHOW FULL PROCESSLIST; -- 長いクエリも完全に表示
とか。
ちょっとひねると
SELECT * FROM information_schema.PROCESSLIST WHERE time > 10 AND info LIKE 'SELECT%';
とか(10秒以上のんびりこいてるSELECTを探せ)。
これは、元々
DESC information_schema.PROCESSLIST;
で見て取れるテーブルがあるから。
追記 2012-02-15
しゃれにならないプロセスがあったら、まずはshow processlistでIDを補足。多分一番左にあると思われる、数字。
で、その数字に対して
mysqladmin kill {ID}
で、その対象プロセスをkill。
ド最悪、これで「厄介なSQL プロセス」を殺せます。