2010年03月03日

MySQLインデックス・簡単調査・最適化

今回はMySQLネタです。

MySQLに対してアクセスが増え、データが溜まってくると、サーバが遅くなったという連絡がはいることがあります。

体感でですが、データが10万件を超えたぐらいから、そういう話が増えて来るようにも思います。

原因としては、INDEXの張り方がうまくない(そもそもはっていない)ということが多いと思うのですが、どこにどうやってはれば良いのか、すぐに分かります?

今回、簡単に見つける方法があることに気がついたので、メモしておきます。phpMyAdminを使います。

phpMyAdminには、「MySQLプロセスの表示」という部分がありますので、「今、サーバが重くなっている」という時点でこちらを開きます。
screen.png

すると、現在実行しているSQLの情報が表示されます。
「プロセス」というタブを数回押してみると、その状態で「いつも同じようなSQL文が何度も表示されている」かもしれません。

それが、INDEXをはるべき場所です。

今回のケースでは、
---------------------------
SELECT *
FROM sales_items
WHERE sale_id = "111111"
---------------------------
というようなSQLが大量に存在していました。
ここで注目すべきは、「WHERE句の後」です。

この場合は、「sale_id が 111111のところ」を検索しにいって時間がかかっているようです。調べてみると、やはり sale_id にはインデックスがはられていませんでした。

phpMyAdminから早速、INDEXをはってみると、このプロセスには表示されないよう(=時間がほとんどかからない作業)になりました。topで見ても、これだけでしゅるしゅると負荷率が下がってゆきます。

なお、
---------------------------
SELECT *
FROM sales_items
WHERE sale_id = "111111" AND nanika_id = 123
---------------------------
のように、WHERE句の後に複数の条件があってプロセスがたくさん存在しているような場合には、複合INDEXを張ったほうが効率が良いようです。

これが一番手軽だとは思いますが、もう少しプロセスを詳しく知りたい、とか、SQL文が長すぎてすべて表示されないんだけど、というような場合には、もう少し工夫できます。

こちらに非常に便利な記事がありました。

Open Tools for MySQL Administrators
http://www.oreillynet.com/pub/a/mysql/2006/10/19/mysql-tools.html

このあたりから便利なツールを見つけてきてチェックするというのも良いと思います。個人的には、「おっ、こんなので十分だ」と思ったんですがいかがでしょうか。

Monitoring MySQL Queries Using Bash Script
http://blog.taragana.com/index.php/archive/monitoring-mysql-queries-using-bash-script/
-----------------------------------
#!/bin/bash
while [ 1 ]
do
mysql -N -u root -pパスワード -e 'show full processlist' |grep -v 'show full processlist'
sleep 2
done
-----------------------------------

たったのこれだけで、えんえんと状態を表示してくれますので、MySQLの状態把握ができます。知らなかった人にはちょっとお役に立てばと思います。


posted by SDozono at 11:47| 東京 🌁| Comment(0) | TrackBack(0) | MYSQL | このブログの読者になる | 更新情報をチェックする
この記事へのコメント
コメントを書く
お名前:

メールアドレス: [必須入力]

ホームページアドレス:

コメント: [必須入力]

認証コード: [必須入力]


※画像の中の文字を半角で入力してください。

この記事へのトラックバック
WebとCTI、VoIP技術の高みを目指して - 技術者の24時間
×

この広告は180日以上新しい記事の投稿がないブログに表示されております。