SlideShare a Scribd company logo
MySQL 初めてのチューニング

 2010/12/11 MySQL Casual Talks #1
          id:Craftworks
自己紹介
•   id:Craftworks
•   Twitter: @Craftworks
•   github: https://github.com/Craftworks
•   Blog: http://d.hatena.ne.jp/Craftworks
•   最近は EC2 で Perl 書いてます
•   ずっと PostgreSQL を使っていた MySQL
    初心者です
今日は MySQL をセットアップしてから
最初にするチューニングの話をします
MySQL のメモリ設定

MySQL のバッファタイプは2種類
 グローバルバッファ
  • mysqld 全体で確保するメモリ
 スレッドバッファ
  • コネクション毎に確保するメモリ
グローバルバッファ
innodb_buffer_pool_size
 – InnoDB のインデックスやレコードをキャッ
   シュする領域
 – InnoDB メインで使うなら最重要パラメータ
innodb_additional_mem_pool_size
 – InnoDB テーブル定義情報
 – 足りなくなったらエラーログに警告が出る
 – 足りなくなった時に増やせばよい
innodb_log_buffer_size
  – InnoDB トランザクションログを管理する領
    域
  – トランザクション終了時もしくは一定時間毎
    にディスクにフラッシュされる
  – 他のパラメータにメモリを回した方が得策
key_buffer_size
  – MyISAM のインデックスをキャッシュする領
    域
  – MyISAM をあまり使わないなら他に回す
query_cache_size
 – SELECT の実行結果をキャッシュする
 – パフォーマンス的にはかなり重要
 – query_cache_type でキャッシュ動作を指定
   できる
スレッドバッファ
sort_buffer_size
  – ORDER BY, GROUP BY に使われる領域
  – 多用する場合は増やす
read_rnd_buffer_size
  – ソート後にレコードを読む際に使用
  – ORDER BY の性能向上
join_buffer_size
  – インデックスを使用しないテーブル結合の
    際に使われる領域
  – インデックスを用いないテーブル結合は避
    けるべきなので大きくする必要は無い
read_buffer_size
  – テーブルスキャンのときに使われる領域
  – インデックスを使わないクエリは発行する
    べきではないので大きくする必要は無い
myisam_sort_buffer_size
 – MyISAM で DDL 系のクエリの時にインデッ
   クスのソートに使われる領域
 – 通常のクエリでは使われないのでそれほど
   多く取る必要は無い
メモリ以外の設定
innodb_log_file_size
  – InnoDBの更新ログを記録するディスク上の
    ファイル
  – innodb_log_file がいっぱいになったら、
    innodb_buffer_poolの中の更新されたデー
    タをディスクに書き出し
  – innodb_buffer_pool_size を大きくしたら
    innodb_log_file_size も合わせて調整
  – 大きくするほどクラッシュリカバリに時間が
    かかる
table_open_cache
 – 開いたテーブルのファイルポインタを格納
   する
 – 同時接続数×テーブル数が最低限必要
 – 1024〜2048 が一般的
 – MyISAM では1テーブルにつき2つ消費
 – OS が処理できる記述子数以内にする
   • cat /proc/sys/fs/file-max
thread_cache_size
 – スレッドをキャッシュして再接続のオーバー
   ヘッドを軽減する
 – 稼働状況に応じて設定する
 – コネクションプーリングしてる場合はあまり
   影響が無い?
以上を考慮して実際の設定
設定の目安
グローバルバッファ
 + (スレッドバッファ × 最大接続数)
 = 搭載メモリの 8 ~ 9 割
警告: 32-bit GNU/Linux x86 上では、メモリ使用を高く設定しすぎないように注意して
ください。glibc はプロセス ヒープがスレッド スタックよりも大きくなる事を許容する可
能性があり、その為サーバがクラッシュしてしまうかもしれません。もし次の式の値が
2GB に近い、またはそれを上回っていたら危険です:

innodb_buffer_pool_size + key_buffer_size +
max_connections*(sort_buffer_size+read_buffer_size+binlog_cache_size) +
max_connections*2MB
設定メモリ量の計算
• 個々の設定を計算するのは面倒臭い
 – ツールがあります
 – mymemcheck
 – !includedir に対応したものを github に置きました
 – https://gist.github.com/733390
 – mysql -e 'SHOW VARIABLES' | mymemcheck
 – mymemcheck ~/my.cnf
実行結果抜粋
global_buffers
 key_buffer_size                  16777216 16.000M
 innodb_buffer_pool_size         268435456 256.000M
 innodb_log_buffer_size           67108864 64.000M
 innodb_additional_mem_pool_size 20971520 20.000M
 net_buffer_length                   16384 16.000K
 ---------------------------------------------------
                                     total 356.016M
運用後のチューニング
key_buffer_size の調整
• SHOW STATUS LIKE 'Key_read%';
  – Key_read_requests / Key_reads = 150 以上になる
    ように key_buffer_size を調整
• SHOW STATUS LIKE 'Key_blocks%';
  – Key_blocks_unused が数百など少ない場合
    key_buffer_size を増やす必要がある。
最大接続数とスレッド数の確認
• SHOW STATUS LIKE '%connection%';
  – Max_used_connections
     • これまでに記録された同時接続数の最大値
• SHOW STATUS LIKE 'Threads%';
  – Threads_connected
     • 現在開いている接続の数
  – Threads_created
     • 接続を処理するために生成されたスレッド数
  – Threads_running
     • スリープ状態になっていないスレッド数
table_open_cache の調整
• SHOW STATUS LIKE 'Open_tables';
  – Open_tables
     • 現在開かれているテーブル数を確認
  – Opened_tables
     • たとえ多くの FLUSH TABLES を実行していない場合でも、
       この値が非常に大きい場合や急速に大きくなる場合
       は、テーブルキャッシュサイズを拡張する
query_cache_size の調整
• SHOW STATUS LIKE 'Qcache%';
  – Qcache_free_memory
     • query_cache_size で割り当てたメモリ残量
     • これが小さくなって、Qcache_lowmem_prunes が増加してい
       たら、query_cache_size の増量を検討
  – Qcache_inserts / Qcache_hits
     • Qcache_inserts に対して Qcache_hitsが少ないとキャッシュ
       のヒット率が悪い
  – Qcache_free_blocks
     • 増加している場合 → フラグメンテーション発生
        – FLUSH QUERY CACHE でデフラグする必要がある
クエリキャッシュの注意点


クエリキャッシュはケースセンシティブ
SELECT … と select … は別クエリ扱い
まとめ
• 最大限のパフォーマンスを発揮できるよ
  うに、なるべく多くのメモリを割り当てる
• かつ、コネクションが増えた時にメモリを
  食い過ぎてスワップが発生しないように、
  安全なラインに設定する
• 運用しながら SHOW STATUS で値を確認
  しながらチューニングする
参考
• 6.5.5. MySQL でのメモリの使用
   – http://dev.mysql.com/doc/refman/5.1/ja/memory-use.html
• 9.3. InnoDB スタートアップオプションとシステム変数
   – http://dev.mysql.com/doc/refman/5.1-olh/ja/innodb-parameters.html
• 4.13.3. クエリ キャッシュの設定
   – http://dev.mysql.com/doc/refman/5.1/ja/query-cache-configuration.html
• 6.4.8. MySQL でのテーブルのオープンとクローズの方法
   – http://dev.mysql.com/doc/refman/5.1/ja/table-cache.html
• 13.5.3. InnoDB 設定
   – http://dev.mysql.com/doc/refman/5.1/ja/innodb-configuration.html
• 5分でできる、MySQLのメモリ関係のチューニング!
   – http://dsas.blog.klab.org/archives/50860867.html
ご清聴ありがとうございました

More Related Content

PDF
MySQLレプリケーションあれやこれや
PDF
DBスキーマもバージョン管理したい!
PPTX
MySQLの運用でありがちなこと
PDF
binary log と 2PC と Group Commit
PDF
MySQL5.7 GA の Multi-threaded slave
PDF
SQLアンチパターン(インデックスショットガン)
PDF
[Aurora事例祭り]Amazon Aurora を使いこなすためのベストプラクティス
PDF
[2018] MySQL 이중화 진화기
MySQLレプリケーションあれやこれや
DBスキーマもバージョン管理したい!
MySQLの運用でありがちなこと
binary log と 2PC と Group Commit
MySQL5.7 GA の Multi-threaded slave
SQLアンチパターン(インデックスショットガン)
[Aurora事例祭り]Amazon Aurora を使いこなすためのベストプラクティス
[2018] MySQL 이중화 진화기

What's hot (20)

PPTX
Redisの特徴と活用方法について
PDF
MySQLで論理削除と正しく付き合う方法
PDF
Osc2015北海道 札幌my sql勉強会_波多野_r3
PDF
【SQLインジェクション対策】徳丸先生に怒られない、動的SQLの安全な組み立て方
PDF
Dbtechshowcasesapporo mysql-turing-for-cloud-0.9.3
PDF
Form認証で学ぶSpring Security入門
PPTX
Sql server 運用 101
PDF
MySQLチューニング
PDF
MySQLやSSDとかの話 前編
DOCX
Keepalived+MaxScale+MariaDB_운영매뉴얼_1.0.docx
PDF
さいきんの InnoDB Adaptive Flushing (仮)
PDF
MySQL Administrator 2021 - 네오클로바
PDF
これからSpringを使う開発者が知っておくべきこと
PDF
MySQL 5.7の罠があなたを狙っている
PDF
基本に戻ってInnoDBの話をします
PDF
Twitterのsnowflakeについて
PDF
ヤフー社内でやってるMySQLチューニングセミナー大公開
PDF
MHA for MySQLとDeNAのオープンソースの話
PDF
Docker Compose入門~今日から始めるComposeの初歩からswarm mode対応まで
PDF
NAND Flash から InnoDB にかけての話(仮)
Redisの特徴と活用方法について
MySQLで論理削除と正しく付き合う方法
Osc2015北海道 札幌my sql勉強会_波多野_r3
【SQLインジェクション対策】徳丸先生に怒られない、動的SQLの安全な組み立て方
Dbtechshowcasesapporo mysql-turing-for-cloud-0.9.3
Form認証で学ぶSpring Security入門
Sql server 運用 101
MySQLチューニング
MySQLやSSDとかの話 前編
Keepalived+MaxScale+MariaDB_운영매뉴얼_1.0.docx
さいきんの InnoDB Adaptive Flushing (仮)
MySQL Administrator 2021 - 네오클로바
これからSpringを使う開発者が知っておくべきこと
MySQL 5.7の罠があなたを狙っている
基本に戻ってInnoDBの話をします
Twitterのsnowflakeについて
ヤフー社内でやってるMySQLチューニングセミナー大公開
MHA for MySQLとDeNAのオープンソースの話
Docker Compose入門~今日から始めるComposeの初歩からswarm mode対応まで
NAND Flash から InnoDB にかけての話(仮)
Ad

Viewers also liked (10)

PDF
カジュアルに本番データを開発環境に入れる #mysqlcasual
PPT
Linux/DB Tuning (DevSumi2010, Japanese)
PDF
メンテナブルでありつづけるためのCSS設計
PDF
Zabbixのパフォーマンスチューニング & インストール時の注意点
PPTX
本当のオブジェクト指向は可読性を上げる
PDF
Advanced nginx in mercari - How to handle over 1,200,000 HTTPS Reqs/Min
PDF
MySQL Performance Tuning. Part 1: MySQL Configuration (includes MySQL 5.7)
PDF
MySQL 5.7にやられないためにおぼえておいてほしいこと
ODP
Memory management in Linux
PDF
逆説のスタートアップ思考
カジュアルに本番データを開発環境に入れる #mysqlcasual
Linux/DB Tuning (DevSumi2010, Japanese)
メンテナブルでありつづけるためのCSS設計
Zabbixのパフォーマンスチューニング & インストール時の注意点
本当のオブジェクト指向は可読性を上げる
Advanced nginx in mercari - How to handle over 1,200,000 HTTPS Reqs/Min
MySQL Performance Tuning. Part 1: MySQL Configuration (includes MySQL 5.7)
MySQL 5.7にやられないためにおぼえておいてほしいこと
Memory management in Linux
逆説のスタートアップ思考
Ad

Similar to MySQL 初めてのチューニング (20)

PDF
Webサーバのチューニング
KEY
Mysql casial01
PDF
Azure Synapse Analytics 専用SQL Poolベストプラクティス
PDF
Amazon ElastiCache - AWSマイスターシリーズ
PDF
20120117 13 meister-elasti_cache-public
PPTX
dimSTATから見るベンチマーク
PDF
スマートフォン向けサービスにおけるサーバサイド設計入門
PDF
Amazon Aurora Deep Dive (db tech showcase 2016)
PDF
今日から使い始めるChef
PDF
Ansible 入門 #01 (初心者向け)
PDF
VarnishCache入門Rev2.1
PDF
States of Dolphin - MySQL最新技術情報2013秋 -
PPT
081108huge_data.ppt
PDF
[INSIGHT OUT 2011] B27 SQL Anywhereの先進のセルフヒーリング技術について(glenn paulley)
PDF
LINEのMySQL運用について
KEY
Web Operations and Perl kansai.pm#14
PDF
Java EE7 䛸㻌JCache 
PDF
MTのダイナミック処理(PHP)を高速化する@サーバーサイドスクリプティング
PDF
CPUの同時実行機能
PDF
SQL Server パフォーマンスカウンター
Webサーバのチューニング
Mysql casial01
Azure Synapse Analytics 専用SQL Poolベストプラクティス
Amazon ElastiCache - AWSマイスターシリーズ
20120117 13 meister-elasti_cache-public
dimSTATから見るベンチマーク
スマートフォン向けサービスにおけるサーバサイド設計入門
Amazon Aurora Deep Dive (db tech showcase 2016)
今日から使い始めるChef
Ansible 入門 #01 (初心者向け)
VarnishCache入門Rev2.1
States of Dolphin - MySQL最新技術情報2013秋 -
081108huge_data.ppt
[INSIGHT OUT 2011] B27 SQL Anywhereの先進のセルフヒーリング技術について(glenn paulley)
LINEのMySQL運用について
Web Operations and Perl kansai.pm#14
Java EE7 䛸㻌JCache 
MTのダイナミック処理(PHP)を高速化する@サーバーサイドスクリプティング
CPUの同時実行機能
SQL Server パフォーマンスカウンター

MySQL 初めてのチューニング

  • 1. MySQL 初めてのチューニング 2010/12/11 MySQL Casual Talks #1 id:Craftworks
  • 2. 自己紹介 • id:Craftworks • Twitter: @Craftworks • github: https://github.com/Craftworks • Blog: http://d.hatena.ne.jp/Craftworks • 最近は EC2 で Perl 書いてます • ずっと PostgreSQL を使っていた MySQL 初心者です
  • 4. MySQL のメモリ設定 MySQL のバッファタイプは2種類 グローバルバッファ • mysqld 全体で確保するメモリ スレッドバッファ • コネクション毎に確保するメモリ
  • 6. innodb_buffer_pool_size – InnoDB のインデックスやレコードをキャッ シュする領域 – InnoDB メインで使うなら最重要パラメータ
  • 7. innodb_additional_mem_pool_size – InnoDB テーブル定義情報 – 足りなくなったらエラーログに警告が出る – 足りなくなった時に増やせばよい
  • 8. innodb_log_buffer_size – InnoDB トランザクションログを管理する領 域 – トランザクション終了時もしくは一定時間毎 にディスクにフラッシュされる – 他のパラメータにメモリを回した方が得策
  • 9. key_buffer_size – MyISAM のインデックスをキャッシュする領 域 – MyISAM をあまり使わないなら他に回す
  • 10. query_cache_size – SELECT の実行結果をキャッシュする – パフォーマンス的にはかなり重要 – query_cache_type でキャッシュ動作を指定 できる
  • 12. sort_buffer_size – ORDER BY, GROUP BY に使われる領域 – 多用する場合は増やす read_rnd_buffer_size – ソート後にレコードを読む際に使用 – ORDER BY の性能向上
  • 13. join_buffer_size – インデックスを使用しないテーブル結合の 際に使われる領域 – インデックスを用いないテーブル結合は避 けるべきなので大きくする必要は無い
  • 14. read_buffer_size – テーブルスキャンのときに使われる領域 – インデックスを使わないクエリは発行する べきではないので大きくする必要は無い
  • 15. myisam_sort_buffer_size – MyISAM で DDL 系のクエリの時にインデッ クスのソートに使われる領域 – 通常のクエリでは使われないのでそれほど 多く取る必要は無い
  • 17. innodb_log_file_size – InnoDBの更新ログを記録するディスク上の ファイル – innodb_log_file がいっぱいになったら、 innodb_buffer_poolの中の更新されたデー タをディスクに書き出し – innodb_buffer_pool_size を大きくしたら innodb_log_file_size も合わせて調整 – 大きくするほどクラッシュリカバリに時間が かかる
  • 18. table_open_cache – 開いたテーブルのファイルポインタを格納 する – 同時接続数×テーブル数が最低限必要 – 1024〜2048 が一般的 – MyISAM では1テーブルにつき2つ消費 – OS が処理できる記述子数以内にする • cat /proc/sys/fs/file-max
  • 19. thread_cache_size – スレッドをキャッシュして再接続のオーバー ヘッドを軽減する – 稼働状況に応じて設定する – コネクションプーリングしてる場合はあまり 影響が無い?
  • 21. 設定の目安 グローバルバッファ + (スレッドバッファ × 最大接続数) = 搭載メモリの 8 ~ 9 割 警告: 32-bit GNU/Linux x86 上では、メモリ使用を高く設定しすぎないように注意して ください。glibc はプロセス ヒープがスレッド スタックよりも大きくなる事を許容する可 能性があり、その為サーバがクラッシュしてしまうかもしれません。もし次の式の値が 2GB に近い、またはそれを上回っていたら危険です: innodb_buffer_pool_size + key_buffer_size + max_connections*(sort_buffer_size+read_buffer_size+binlog_cache_size) + max_connections*2MB
  • 22. 設定メモリ量の計算 • 個々の設定を計算するのは面倒臭い – ツールがあります – mymemcheck – !includedir に対応したものを github に置きました – https://gist.github.com/733390 – mysql -e 'SHOW VARIABLES' | mymemcheck – mymemcheck ~/my.cnf
  • 23. 実行結果抜粋 global_buffers key_buffer_size 16777216 16.000M innodb_buffer_pool_size 268435456 256.000M innodb_log_buffer_size 67108864 64.000M innodb_additional_mem_pool_size 20971520 20.000M net_buffer_length 16384 16.000K --------------------------------------------------- total 356.016M
  • 25. key_buffer_size の調整 • SHOW STATUS LIKE 'Key_read%'; – Key_read_requests / Key_reads = 150 以上になる ように key_buffer_size を調整 • SHOW STATUS LIKE 'Key_blocks%'; – Key_blocks_unused が数百など少ない場合 key_buffer_size を増やす必要がある。
  • 26. 最大接続数とスレッド数の確認 • SHOW STATUS LIKE '%connection%'; – Max_used_connections • これまでに記録された同時接続数の最大値 • SHOW STATUS LIKE 'Threads%'; – Threads_connected • 現在開いている接続の数 – Threads_created • 接続を処理するために生成されたスレッド数 – Threads_running • スリープ状態になっていないスレッド数
  • 27. table_open_cache の調整 • SHOW STATUS LIKE 'Open_tables'; – Open_tables • 現在開かれているテーブル数を確認 – Opened_tables • たとえ多くの FLUSH TABLES を実行していない場合でも、 この値が非常に大きい場合や急速に大きくなる場合 は、テーブルキャッシュサイズを拡張する
  • 28. query_cache_size の調整 • SHOW STATUS LIKE 'Qcache%'; – Qcache_free_memory • query_cache_size で割り当てたメモリ残量 • これが小さくなって、Qcache_lowmem_prunes が増加してい たら、query_cache_size の増量を検討 – Qcache_inserts / Qcache_hits • Qcache_inserts に対して Qcache_hitsが少ないとキャッシュ のヒット率が悪い – Qcache_free_blocks • 増加している場合 → フラグメンテーション発生 – FLUSH QUERY CACHE でデフラグする必要がある
  • 30. まとめ • 最大限のパフォーマンスを発揮できるよ うに、なるべく多くのメモリを割り当てる • かつ、コネクションが増えた時にメモリを 食い過ぎてスワップが発生しないように、 安全なラインに設定する • 運用しながら SHOW STATUS で値を確認 しながらチューニングする
  • 31. 参考 • 6.5.5. MySQL でのメモリの使用 – http://dev.mysql.com/doc/refman/5.1/ja/memory-use.html • 9.3. InnoDB スタートアップオプションとシステム変数 – http://dev.mysql.com/doc/refman/5.1-olh/ja/innodb-parameters.html • 4.13.3. クエリ キャッシュの設定 – http://dev.mysql.com/doc/refman/5.1/ja/query-cache-configuration.html • 6.4.8. MySQL でのテーブルのオープンとクローズの方法 – http://dev.mysql.com/doc/refman/5.1/ja/table-cache.html • 13.5.3. InnoDB 設定 – http://dev.mysql.com/doc/refman/5.1/ja/innodb-configuration.html • 5分でできる、MySQLのメモリ関係のチューニング! – http://dsas.blog.klab.org/archives/50860867.html