最近処理速度を調べる機会が多かったので自分で改めて復習と勉強しました.
呼び出し元の話から、mysql自体の細かい話まで知っている限り載せまくります。
◆ 呼び出し元
・SQLを連射しないようにする
– コネクションを貼る回数を下げる
– 物によってはindexを使うため連射した方が良かったりもする
– 呼び出されているSQLをうまい具合にファイルにまとめて、呼ばれすぎているものとか見つけるのもいいかも
数を数える例(sqlはいい感じに持ってきてください
sql.txt sort | uniq -c | sort -n
・キャッシュが使われるように大文字を使う(SELECTなどを統一する)
– キャッシュは同じ式で使われるので当たるように合わせる
・少ない件数(1件とか)で良いものはちゃんとlimit 1などで制御をかける
・無駄な order by / group by をしない
– 並び替えはレコードが多くなればなるほどコストかかる
・カラムはアスタリスクで指定しない
– 全部取得でも変換コストがあるので一応書く。データが多くなると良くない
・ほぼ全件(70%ぐらい)を取ってくるような時にはあえてフルスキャンをする
– index->値と1つの値につき2アクションが必要になってしまうためあえて
・レコード全件の数を数えたいのであれば、information_schemaで確認する
– count(*)よりもこっちの方が良い
◆ Mysql
・新しいバージョンのMysqlを使う
– 新しい方が基本早い(そらそうだ)
・バッファのサイズを適切にする
・indexをつける
– よく呼び出すものにはつけよう
・無駄にindexをつけすぎない
– insert/updateをする際のコストになるので更新頻度と相談しながら無駄なindexはつけない
・無駄にauto increment を使わない
– insertをする際のコストになるので更新頻度と使い方と相談
・nullを使わない
– concatとか想定外の動きしたりする。indexも効かない?はず
・パーティションを使う
– パーティションを使うことでのデメリットもあるので確認しながら利用
・テーブルを分ける
– データへのアクセスの仕方によるが同じ内容でも日付とかで分けたりするとアーカイブとかもしやすい
・接続の物理的な距離を短くする
– RDSなどを利用している場合にはリージョンなどを近いものを選択すると通信コストがかからない
◆ その他
・投げたり設置する前にexplainで実行計画を見る
– 基本全て確認する
・複数回実行した時の時間を測れるBENCHMARK関数で色々試してみる
– 本番とかにやるとやばかったり
・スロークエリログを出して確認する
– オプションをオンにして確認
詳しく知りたい人はドキュメントを読んだり、本で体系的に深く学ぶのもアリ。
以上
コメント