1日目のメモはこちらです。-> MySQLユーザコンファレンス2008 1日目(10/30)メモ
MySQL Performance Tuning 1 (10:00 ~ 10:50)
slow query logを調査
- インデックスを活用する
- クエリを書き直す
- オプティマイザの問題
スロークエリログについて
mysql 5.1で拡張される機能
- fileだけでなくて、tableにもロギングできる
- 稼動中にロギングのon/offの変更が出来る
- 単位がマイクロセカンドになる (以前は秒単位)
- しきい値(long-query-time)を0秒にして、全クエリログを取ることもできる
EXPLAIN文
- クエリのどこが悪いかを調べるために使う
- 使い方 - クエリの前にEXPLAINをつけるだけ
- select_type
- simple: selectだけのクエリ
- subquery: UNION、JOINとかを使うクエリ
- type
- single_row
- system: テーブルにひとつの行だけのとき
- const
- eq_ref
- ref
- range
- index: Full index scan
- all: Full table scan
- extra
- Using where
- Using temporary
- Using filesort
- Using index
- Using index for group-by
mk-virual-explain
- EXPLAINの結果がツリー状に表示される
- http://www.maatkit.org
- Part of the Maatkit toolkit
- このツールはフォローするのが難しいねーって言ってた
- 午後のセッションでさらに掘り下げるよ
query cache
- クエリと、その結果をキャッシュする
- 同じクエリが投げられたら、キャッシュしてる結果をクライアントに返す
- ハッシュ構造
- クエリがキー、結果が値
- 結果が同じ(ex:whereの条件の論理的な意味が同じ)でも、クエリが違えばクエリキャッシュは有効にならない
- sql1: where a = 5 OR a = 10
- sql2: where a IN(5,10)
- 実行するたびに結果が変わる関数もキャッシュされない
- DATEとか
Configuration Options
- query-cache-type
- NO_SQL_CACHEと明示的に指定したらキャッシュしない
- query-cache-size
- query-cache-limit
show global status
- Com_select
- キャッシュにhitしなかったクエリ数
- Qcache_hits
- キャッシュにhitしたクエリ数
- 他にも色々パラメータがある
- show global status like 'Qcache_%';
query cacheには注意も必要
- 非常に大きいサイズにしてしまうと、その分キャッシュのパージに時間がかかる
- パージ中はキャッシュできないので、実質止まるようになる?(と言ってた気がする。でも止まるの意味がよくわからない)
- キャッシュサイズ 12GByteとかやめてね! Hahahaha
- 負荷の高いサーバの場合、クエリキャッシュをdisableにしたほうが逆に性能あがるかも
- クエリがキャッシュにhitするか都度チェックするため??
MySQL で押さえておくこと (11:00 ~ 11:50)
Table/Index Partitioning
Full Text/Plug-in Enhancements
- ParserをPlug-inで追加できる。
- SHOW PLUGIN
- UNINSTALL PLUGIN
- INSTALL PLUGIN
Archive Engine Enhancements
- Faster I/O operations
- Lower Memory
- Autoincrement column support
- Unique key support
- Non-unique key support
- Archive Reader tool
- オンラインバックアップツール
MySQL Cluster Disk-Based Data
- 今までのクラスタはメモリベースだった
- (データもインデックスもメモリに置く必要があった?)
- 5.1ではこれを拡張して、データはディスクに書けるになった。
- メモリに置くのはインデックスだけ
Row-Based Replication
Easier Manageability
High Performance
- Faster Alter Table/Faster Add-Drop Index
MySQL Performance Tuning 2 (14:00 ~ 14:50)
大盛況。人数多すぎて制限かかった? 時系列とは異なりますが、午前のセッション繋がりなので、こちらを先に書きます。後半は私の脳みそのスタミナ不足により内容に追いつけませんでした。
結果(指標はqps?)
CPU利用率
- MyISAM: connection 64以降でCPU利用率が落ちた
- 接続数増加によるテーブルロックが原因
- Archive: CPUをうまく利用する
まとめ
- Archiveは性能は良いが、用途が限られる
- update,deleteできない
- 検索用のINDEXが使えない
TIME-ENTRY
- timestampが一番良い
- TRIGGERが一番悪い
INDEX Merge Test
InnoDB INDEX Merge
status
- SHOW GLOBAL STATUS LIKE 'handl%';
- SHOW SESSION STATUS LIKE 'handl%';
- SHOW ENGINE INNODB STATUS\G
@Nifty ココログ PostgreSQLからMySQLへのマイグレーション考察 (13:00 ~ 13:50)
cocologとは
ユーザ数、記事数
- ユーザ数は無料会員のほうが多い
- が、投稿記事数は接続会員(ISPユーザの有料会員)のほうが多い
現在のシステム構成
cocologの歴史
- Phase1
- DB: PostgreSQLのサーバ1つ
- 10サーバ
- TypePadで静的コンテンツをはいて、Webサーバにうp
- Phase2
- Phase3
- memcached採用
- 携帯に対応
- 200サーバ
- このころからPostgreSQLは腫れ物のように
- 統計情報を取得することすらガクブル
- Now
- 150サーバ
- MySQLに移行
DBP: Database Partitioning
- 全情報を1サーバにもっていたものを、ユーザごとに振り分け
- ユーザごとの共通DB、ユーザごとのDBなどに
- TheSchwartzにjobを投げて、1ユーザずつPostgreSQLからMySQLに移行
Postgresql => MySQLで困ったことなど、苦労話
- Postgresql時代
- DBサーバ。上位スペックの機種に買い換えて耐えていた
- 最終形態: Redhat AS4, 3.3GHz 2Core * 4, mem 16G
- Postgresql 7.4 => 8.1
- Data size 100GB
- 巨大なインデックス (40%)
- 7.4 => 8.1にして早くなった
- 文字コードで困った(UNICODE圏のSPAM)
- 8.1のrestore時にはじかれた