CentOS5.4にMySQL5.5をインストールするメモ

NO IMAGE

最近、サーバ構築系の仕事が多いので、自宅での検証用にネットブックを購入し、
CentOSをインスコしてシコシコいじくってます。
PB218734.JPG

ネットブックは、スペックが低いですが個人的なLinuxの検証用には最適のマシンです。
・初期費用が安い(3万くらい)。
・維持費が格安(電気代が1ヶ月つけっぱなしで700円くらい)。
・静か(ファンやハードディスクの音がほとんど無い)。

そんな中、MySQLを使った仕事がはじまるかもしれないので、色々とイジくりまわしてみました。

その中で感じたのが、データ件数が多くなると(10万件以上)、SQLでのデータ検索が非常に重くなる・・・。

オプティマイザの実行計画を見てみると、どうもテーブル結合するときにテーブルをフルスキャンしている。
インデックスを適切に貼っても改善されないのでネットで調べてみると、どうもMySQLはオプティマイザの性能があまりよくないようです。

現在MySQLの正式リリース版はバージョン5.1(2010年11月20日)ですが、
開発バージョンのMySQL5.5で、かなりオプティマイザが改善されているという情報があったのでインスコしてみたのでメモします。

CentOSはパッケージ管理に「yum」を使用できますので、これを利用しインスコします。

まず、yumのデフォルトリポジトリではMySQL5.5をインスコできないので、
remiリポジトリを使いインスコする準備をします。

①remiリポジトリの情報をダウンロードし、RPMにインスコ。

wget http://rpms.famillecollet.com/enterprise/remi-release-5.rpm 
wget http://download.fedora.redhat.com/pub/epel/5/x86_64/epel-release-5-4.noarch.rpm
rpm -Uvh epel-release-5-4.noarch.rpm remi-release-5.rpm

②remiリポジトリの設定ファイルが出きるので、編集する。

vi /etc/yum.repos.d/remi.repo
priority=1
※ファイルの一番下に追加

③ダンプファイルで、既存のデータを保存しておく。

mysqldump データベース名 -u root -pパスワード --opt  > ダンプファイル名

④既存のMySQLを削除

yum remove mysql mysql-server mysql-libs

⑤既存のデータファイルが残っているので、削除(リネームして一応取っておく)

mv mysql _mysql
※既存のデータファイルが残したままインスコできますが、データのストレージが違うためか、エラーが頻発し、悩むことになるので消しましょう。

⑥MySQL5.5をインスコ。

yum --enablerepo=remi-test install mysql mysql-server
yum --enablerepo=remi install  mysqlclient15
※libmysqlclient15が無いとエラーになったら、まず上記をインスコする。

⑦正常インスコ後、MySQLを起動。

/etc/init.d/mysqld start

⑧MySQLにログイン。

mysql -u root -p
※パスワードがまだ設定されていないので、パスワード入力は何も入力せずにエンター

⑨ログイン後、バージョン情報が表示されるので5.5になっているか確認する。

Server version: 5.5.7-rc MySQL Community Serve

⑩一度、MySQLをログアウトし、以前のデータをリストアする(完了)。

exit;
mysql -u root -p データベース名 < ダンプファイル名
※データベースはリストア前に手動で作っておく。

⑪その他(外部からMySQL接続できるように、ユーザ作成)。

GRANT ALL PRIVILEGES ON *.* TO ユーザ名@'%' IDENTIFIED BY 'パスワード' WITH GRANT OPTION;

⑫その他(統計情報を再構築)。

mysqlcheck --analyze -optimize --database データベース名 -u root -p
※データを大量にINSERT、DELETEしているとオプティマイザが正しく動作しなくなるので、適度に統計を取りなおす。

MySQLインスコ後、問題のSQLは爆速になりました。
実行計画で、正しくインデックスが使用されているのも確認。

MySQL5.1でもJOIN句の変わりに、STRAIGHT_JOIN句を書くと、デーブルを結合する順番を指定できるので、適切なインデックスを使用することは可能です。
ですが、運用が始まるとデータ件数が変わり、思ったとおりにインデックスが使用されなくなることも考えられるかと思います。
そうなると遅くなるたびに、SQLを書き換えることになり現実的ではありません。

やっぱりオプティマイザが正しくインデックスを使用してくれるのが、一番楽です。

ただ、MySQL5.5は2010年11月時点では、開発バージョンなので、お客様に納品するシステムでは、正式バージョンの5.1を使用することになりそうです。

早く、5.5が正式リリースされることを祈るまうす。