カテゴリー別アーカイブ: MySQL

MySQL(AWSのRDS)で高負荷なSQLを実行してしまい、CPUがずっと100%のままになってしまった

とあるWebサービスを作成してて、DBのクエリー処理を変更したら、サイトが応答しなくなってしまいました。

EC2とRDSの状態を確認してみたところ、RDSのほうでCPU使用率が100%固定になってしまっていました。

しばらく待てばおさまるかなと思いつつ30分、、、

一向におさまる気配はありません、データ量はまだそんなにないのでクエリーがよほどひどかったのでしょう。テーブルの構造を変更する必要がありそうです。。。

そんなことはさておき、30分経ってもおさまらないので、何か対策が必要です。

思いつくのは実行されているであろうクエリーを探し出し、そいつをSTOPすること。

以下の手順で行ないました

EC2上で

mysql –host example.rds.amazonaws.com -u exampleuser -pExamplePassword

のようなコマンドでSQLにログイン

SHOW FULL PROCESSLIST\G

を実行して、残っているクエリ一覧を表示し、あやしいクエリーのIDを控える

KILL 218815;

であやしいクエリーをストップ(数字のところは先ほど控えたIDに置き換えてください)

以上の対策で、無事にCPU使用率が下がりました。

もう少しカンタンにプロセス管理ができるといいんですが。。。

 

phpMyAdmin でテーブル一覧がページングされるのを解除する

最近のバージョンの PHPMyAdmin は左側のフレームに表示されるテーブル一覧がページングされるようになった。

テーブルを選択する際にいちいちページを切り替えて探さないといけないので、自分にとっては何のメリットも無いどころか、かなり使いにくくなってしまった。

しばらくそのままで使っていたが、我慢の限界で、ページングしないようにできないものか設定をいじってみたら、ページングを解除できた。

vi config.inc.php で以下を追加する

$cfg[‘MaxNavigationItems’] = 100;
$cfg[‘MaxTableList’] = 100;

ログアウトしてログインしなおせば、ページングされずに1画面で表示されるようになった。

テーブルが100個以上ある場合は数字をもっと大きくすれば大丈夫だと思います。

 

MySQLで月別にユニークユーザ数を出すSQL

MySQL のデータの中から月別に○○の数を出す、という集計は良くあるのですが、いつも書き方を忘れてしまうので、例を挙げておきます。

例えば販売データが purchase というテーブルに入っていて、購入者の ID が user_id カラムに、購入日が created_at カラムに格納されているとすると、月別の購入者数は

SELECT DATE_FORMAT(created_at, ‘%Y-%m’) as reg_time,COUNT(DISTINCT user_id) FROM purchase GROUP BY reg_time ;

というSQLで集計できます。

これを使えば、アクセスしたマンスリーユニークユーザ数などを集計することができます。

日別への応用は簡単です、DATE_FORMAT の部分を以下のようにすれば日別になります。

SELECT DATE_FORMAT(created_at, ‘%Y-%m-%d’) as reg_time,COUNT(DISTINCT user_id) FROM purchase GROUP BY reg_time ;