こがこんにちは、こがです。今回はメモがてらMySQLのチューニングについて、自分で調べながらメモとして記事を書いていこうと思います。チューニング方法を書いていきますが、動作環境はこれ!っていうのはありません。現在の環境で動いているものであれば動くとはおもいますが。SQL・テーブル設計周りのチューニングスロークエリを見つけるまずはじめに行うべきはスロークエリになっている部分の改善でしょう。スロークエリを見つけるにはMySQLの設定が必要です。my.cnfに以下の設定をし、再起動します。ログの保存先やスロークエリとするlong_query_timeの値は適宜変えてください。0.5こうして書き出したログはmysqldumpslowコマンドを利用することで集計することが出来ます。tをつけて以下のようにします。queryの設定と解析方法http://masayuki14.hatenablog.com/entry/20120704/1341360260実行計画を確認するスロークエリを割り出したことで、直していくべきクエリがどれか判明しました。そのクエリがどうして重たいのか?などは分からない場合も多くはありません。その場合にはEXPLAINを利用して、MySQLの実行計画を確認してみると良いでしょう。先頭にEXPLAINをつけるだけこの結果を見ることでインデックスはしっかり利用されているか?無駄に行フェッチをしていないか?など色々な問題点を確認することが出来ます。参考リンク:MySQLのEXPLAINを徹底解説!!http://nippondanji.blogspot.jp/2009/03/mysqlexplain.htmlインデックスを適切に利用するMySQLではインデックスを利用する上でいくつかの制限があります。その制限をちゃんと把握しておくことが必要になります。インデックスは同時に一つしか使われない例えばプライマリキー/インデックスA/インデックスBがあるとき、インデックスAとインデックスBはもちろんのことプライマリキーとインデックスAや、プライマリキーとインデックスBを同時に利用してくれない。インデックスのカラムの順番とWHERE句で指定されているカラムの順番が一致している必要があるインデックスにcol1,col2の順で設定されている場合にはWHERE句で指定する順番もcol1,col2の順番でないとインデックスを利用してくれない。上記の注意点以外にもInnoDBはクラスタインデックスであることや、セカンダリインデックスにはクラスタインデックスののキーが含まれています。インデックスの基礎知識とありがちな間違いhttp://techlife.cookpad.com/entry/2017/04/18/092524カバリングインデックス必要なデータをインデックスに含まれるように設定しておくことでデータのフェッチを早くする手法です。(1)http://d.hatena.ne.jp/a666666/20100920/1284992435遅いJOINを速くするJOINはよく遅いと言われます。それはなぜでしょうか。JoinMySQLでは簡単に言うと、このNLPしか実装されていません。Joinはどのような仕組みで動いているのでしょうか。Loopというくらいですから入れ子のループが回って動いています。テーブルAの一行をフェッチして、テーブルBからマッチングするものを探して、またテーブルAの一行をフェッチして・・・・を繰り返していきます。計算量としてとても大きくなりそうだというのはすぐ分かって頂けると思います。テーブルAが100行増えればテーブルBを100回走査しないといけなくなりますからね・・・。いわゆる計算量OがテーブルA×テーブルBであることがおわかり頂けると思います。速くするためには、このかけ算の結果を小さく出来れば良いという形になります。遅くなる理屈と対処法https://qiita.com/yuku_t/items/208be188eef17699c7a5パーティショニングデータを1カ所ではなく、特定の条件に基づいて振り分けを行い別々に保存する仕組みです。上手に設定を行うことでパフォーマンスを上げることが出来ます。ログデータなど一部のデータをまとめて消したりする際にも役に立ちます。振り分けを行う為には条件とするデータがプライマリキーに含まれている必要があります。パーティショニングまとめhttps://qiita.com/taroshin/items/608076c9f8e09497c4b1MySQLの設定によるチューニングメモリ周りの設定を行う際には、グローバルバッファとスレッドバッファの違いに気を付けましょう。確保量が実際のメモリをオーバーしないように注意しましょう。InnoDBの設定innodb_file_per_tableInnoDBのデータをテーブルごとにディスクに保存します。テーブルごとにデータが記録されるのでパフォーマンスが上がります。innodb_buffer_pool_sizeInnoDBにおいて、データとインデックスを保持するバッファです。メモリ全体の80%程度と良く言われます。innodb_log_file_size書き込みが高負荷のシステムでは大きくすると良い。このファイルがいっぱいになると更新データのディスクへのフラッシュが行われる。クエリキャッシュの概要と導入・評価方法https://weblabo.oscasierra.net/mysql-query-cache/終わりにMySQLの設定チューニングに関してはとりわけ大事な部分にとどめました。多くの部分は参考リンクでも語って頂いてるのでそちらにお任せするのが良いと判断しました。MySQLのチューニングもそうですがそれよりもアプリ側でのテーブル設計やSQLが重要だと思っています。ここに書いたことを少しでも多くの方の役に立ったらなと思います。