my.cnfのサンプル
[mysqld]
# サーバ毎に一意な値を設定する。レプリケーション時に使用される。
server-id=10
### コネクション・スレッド数
# 接続可能な最大接続数、多すぎるとメモリ不足になる可能性あるし、少なすぎるとクライアントが接続できなくなる。
# show status like 'Max_used_connections'; で最大どのくらい接続きてるかを確認しておく。
max_connections = 300
# コネクション切断してもスレッドをキャッシュしておく数。
# キャッシュ多めにしておけばスレッド作成→破棄→作成のオーバーヘッド少なくなるので、接続クライアントが多い場合には有効に働きそう。
# max_connections/3くらいが妥当らしい。
# show status like 'Threads_created'; で新規作成されたスレッド数確認できるので、この値が低ければ問題ない。
thread_cache_size = 100
### スレッドバッファ
# sort用のバッファサイズ。このサイズ越えるとディスク使用されるので遅くなる。
# バッチ処理などで大量データ使用する場合は、処理前に動的に値変更するのもいいらしい。
# show status like 'Sort_merge_passes%'; で値が大きければ調整した方がよさげ。
sort_buffer_size = 2M
### クエリキャッシュ
# select文とその結果をメモリにキャッシュして同じ問い合わせがきたらメモリからキャッシュを返す。
# セッション間で共有できるので、別のクライアントで生成されたキャッシュを別のクライアントに返すことができる
# サイズを大きくしすぎるとオーバーヘッド増える、数十メガバイトのサイズが通常は有益。
# テーブル更新されるとクエリキャッシュ内の関連エントリがフラッシュされる
# 頻繁にテーブル更新ある場合は、無効化するのもあり。
# クエリーは、同一とみなされるためには、正確に同じ (バイトごと) である必要があります。
# SELECT * FROM tbl_name と Select * from tbl_name は別ものと判断され別々にキャッシュされる。
# Qcache_hits/(Qcache_hits+Qcache_inserts+Qcache_not_cached)*100=キャッシュヒット率
# が小さければクエリキャッシュ無効でもいいのかも。80%くらいが妥当?
# Qcache_lowmem_prunes が高い場合はメモリ不足、通常は0?
query_cache_size = 32M
# このバイト数より大きい結果をキャッシュしません。デフォルト値は 1M バイトです。
query_cache_limit = 1M
# 0:キャッシュしない 1:SELECT SQL_NO_CACHE以外のクエリをキャッシュする 2:SELECT SQL_CACHEのクエリのみキャッシュする
query_cache_type = 1
### InnoDB
# テーブル/インデックスのデータをキャッシュしておくメモリ領域
# MySQL専用サーバでInnoDBのみ使用してるなら総メモリの80%くらい割り当てる
# OSや他のアプリケーションが使用する分も考慮する。
# 大きい値割り当てる場合、vm.overcommit_memory変更した方がいいかも。
innodb_buffer_pool_size = 4G
# InnoDBログファイル(REDOログ)のサイズ(ib_logfile0/ib_logfile1)
# 大きくするとクラッシュリカバリ(クラッシュ後にMySQL再起動時のクリーンアップ処理)に時間かかる
# 更新データをログ書き込んでく、いっぱいになったらinnodb_buffer_poolの中のコミット済みのデータをディスクに書き出す
# なので大きくすればディスク書き込み減るのでパフォーマンスは上がる
# innodb_buffer_pool_sizeの1/4くらい?
innodb_log_file_size = 1G
innodb_log_files_in_group = 2
# データファイル・ログファイルにフラッシュするときの方法
# fsync : fsync() システムコールを使用して、データファイルとログファイルの両方をフラッシュします。fsync はデフォルト設定です。
# O_DSYNC : O_SYNC を使用してログファイルを開いてフラッシュし、fsync() を使用してデータファイルをフラッシュします。さまざまな種類の Unix で問題が発生しているため、InnoDB では直接 O_DSYNC が使用されません。
# O_DIRECT : O_DIRECT (Solaris では directio()) を使用してデータファイルを開き、fsync() を使用してデータファイルとログファイルの両方をフラッシュします。このオプションは、一部の GNU/Linux バージョン、FreeBSD、および Solaris で使用可能です。
# O_DIRECT_NO_FSYNC : I/O のフラッシュ時に O_DIRECT を使用しますが、後続の fsync() システムコールはスキップします。この設定は、一部のタイプのファイルシステムには適していますが、その他には適していません。たとえば、XFS には適していません。たとえば、使用中のファイルシステムですべてのファイルメタデータを保持するために、fsync() が必要であるのかどうかが不明な場合は、代わりに O_DIRECT を使用してください。このオプションは MySQL 5.6.7 (Bug #11754304、Bug #45892) で導入されました。
# ハードウェアRAIDでキャッシュがある場合(OSファイルシステムのキャッシュがある場合?)は、InnoDBのキャッシュと2重にキャッシュされるのが無駄なので、O_DIRECTにすると早くなる
innodb_flush_method = O_DIRECT
# innodbの各テーブルとインデックス(テーブルスペース)を個別のファイルに格納する(*.ibd)
innodb_file_per_table = ON
# 共有テーブルスペースの場所とサイズを指定する。
# 固定1Gでibdata1とibdata2作成する、サイズ超えた場合は自動拡張する
innodb_data_file_path = /var/lib/mysql/ibdata1:1G;/var/lib/mysql/ibdata2:1G:autoextend
### Logging
# slowクエリのロギング有効
slow_query_log = ON
# この秒数以上の時間かかってるクエリが対象
long_query_time = 1
# スロークエリーログファイルの名前(default:host_name-slow.log)
slow_query_log_file = /var/log/mysql/slow-query.log
# エラーログ
log-error = /var/log/mysql/mysqld.log
# バイナリログを有効化する。主にバックアップとレプリケーション用
# 自動で削除されないので明示的に指定して削除する
log-bin=mysql-bin
expire_log_days = 7
# STATEMENT: 実際に実行されたSQLが記録される.ログ少なくなる.必ずしも全てのクエリがslave側に反映されるとはかぎらない(整合性ずれる)
# ROW: 行ベースで変更した値をログに書き込む(base64).ログが多くなる.整合性問題ない
# MIXED: STATEMENTとROW混在のレプリケーション
binlog_format = ROW
# ログに出力するタイムスタンプ デフォルトはUTC
log_timestamps = SYSTEM
### Others
# アイドルタイムアウト時間(秒)、無通信がこの時間経過すると接続を切断する。
wait_timeout=3600
# 大きなデータをやりとりするなら変更する
max_allowed_packet=8M
# 文字コード
default-character-set = utf8mb4