その前に
必要に応じて RESET QUERY CACHE コマンドを利用してクエリキャッシュを削除するべし
mysql> RESET QUERY CACHE; Query OK, 0 rows affected (0.00 sec)
MySQLTuner
設定を変更するツールではなく、サーバのパフォーマンスの概観を表示し、推奨設定を提示してくれるツール
cd /usr/local/src/ wget -d https://github.com/major/MySQLTuner-perl/archive/master.zip unzip master.zip cd MySQLTuner-perl-master/ ./mysqltuner.pl
>> MySQLTuner 1.2.0 - Major Hayden <major@mhtx.net>
>> Bug reports, feature requests, and downloads at http://mysqltuner.com/
>> Run with '--help' for additional options and output filtering
[OK] Logged in using credentials from debian maintenance account.
-------- General Statistics --------------------------------------------------
[--] Skipped version check for MySQLTuner script
[OK] Currently running supported MySQL version 5.5.34-0ubuntu0.12.04.1-log
[OK] Operating on 64-bit architecture
-------- Storage Engine Statistics -------------------------------------------
[--] Status: +Archive -BDB -Federated +InnoDB -ISAM -NDBCluster
[--] Data in MyISAM tables: 56B (Tables: 11)
[--] Data in InnoDB tables: 4M (Tables: 100)
[--] Data in PERFORMANCE_SCHEMA tables: 0B (Tables: 17)
[!!] Total fragmented tables: 100
-------- Security Recommendations -------------------------------------------
[OK] All database users have passwords assigned
-------- Performance Metrics -------------------------------------------------
[--] Up for: 11d 22h 54m 56s (95K q [0.092 qps], 3K conn, TX: 224M, RX: 14M)
[--] Reads / Writes: 81% / 19%
[--] Total buffers: 192.0M global + 2.7M per thread (151 max threads)
[OK] Maximum possible memory usage: 597.8M (60% of installed RAM)
[OK] Slow queries: 1% (1K/95K)
[OK] Highest usage of available connections: 1% (2/151)
[OK] Key buffer size / total MyISAM indexes: 16.0M/125.0K
[!!] Key buffer hit rate: 94.6% (368 cached / 20 reads)
[OK] Query cache efficiency: 69.6% (50K cached / 71K selects)
[OK] Query cache prunes per day: 0
[OK] Sorts requiring temporary tables: 0% (0 temp sorts / 2K sorts)
[!!] Temporary tables created on disk: 34% (1K on disk / 3K total)
[OK] Thread cache hit rate: 99% (2 created / 3K connections)
[OK] Table cache hit rate: 28% (285 open / 998 opened)
[OK] Open file limit used: 10% (107/1K)
[OK] Table locks acquired immediately: 100% (29K immediate / 29K locks)
[OK] InnoDB data size / buffer pool: 4.6M/128.0M
-------- Recommendations -----------------------------------------------------
General recommendations:
Run OPTIMIZE TABLE to defragment tables for better performance
When making adjustments, make tmp_table_size/max_heap_table_size equal
Reduce your SELECT DISTINCT queries without LIMIT clauses
Variables to adjust:
tmp_table_size (> 16M)
max_heap_table_size (> 16M)
[bash]
[!!]と出ている行が警告で、チューニングの改善が必要な箇所が提示される
また--host <hostname> でリモートホストに接続することも可能
<h1>既存ツールで状況確認</h1>
MySQLの稼働総時間や開かれているテーブルの数を調べる
[bash]
mysqladmin -uroot -pXXXXXXXXX status
Uptime: 1036930 Threads: 1 Questions: 96337 Slow queries: 1550 Opens: 998 Flush tables: 1 Open tables: 285 Queries per second avg: 0.092
より詳細に知りたい場合は
mysqladmin -uroot -pXXXXXXXXX extended-status | lv
mysqlslap
クライアント負荷エミュレーション
mysqlslapはテストを開始すると共にmysqlsapというデータベースとt1というテーブルを自動作成し、テストが完了すると削除する
root@hostname:/home/admin# mysqlslap --version
mysqlslap Ver 1.0 Distrib 5.5.39-MariaDB, for debian-linux-gnu (x86_64)
root@hostname:/home/admin# mysqlslap --no-defaults --auto-generate-sql --engine=innodb --auto-generate-sql-write-number=1000 --concurrency=100 --auto-generate-sql-execute-number=100 --auto-generate-sql-load-type=read --iterations=3 --user=root --password=password
Benchmark
Running for engine innodb
Average number of seconds to run all queries: 19.531 seconds
Minimum number of seconds to run all queries: 19.407 seconds
Maximum number of seconds to run all queries: 19.776 seconds
Number of clients running queries: 100
Average number of queries per client: 100
| --no-defaults | my.cnf に書かれたデフォルト値を無視する。このオプションは先頭に付ける必要がある |
| --auto-generate-sql | ファイルやコマンドオプションを介して提供されていない場合、SQLステートメントを自動的に生成する |
| --auto-generate-sql-guid-primary | GUIDベースの主キーカラムを作成する |
| --engine | ストレージエンジンを指定する |
| --auto-generate-sql-write-number | 各スレッドで実行するINSERT回数を指定する(デフォルト100) --no-dropで確認したところ、t1のレコード格納数 |
| --concurrency | 同時接続数 |
| --auto-generate-sql-execute-number | クライアント毎に発行するSQLクエリ数を指定する。concurrencyとの積が実行される全クエリ数 |
| --auto-generate-sql-load-type | アクセスパターンを指定する。read (scan tables), write (insert into tables), key (read primary keys), update (update primary keys), or mixed (half inserts, half scanning selects) |
| --iterations | 実行するテストの回数 |
| --number-int-cols | テストテーブルに作る INT 型カラムの数 |
| --number-char-cols | テストテーブルに作る VARCHAR 型カラムの数 |
| --no-drop | プログラムの終了時、作成したスキーマを削除しない、どんなテーブルで検証したか確認できる |
★queryを指定できる?
http://hack.aipo.com/archives/2959/
tcpdumpでSQL読み取り可能?
DBT2
SysBench
supesmack
mybench
シンプルにパラメーターが書かれている
http://www.powercms.jp/blog/2012/10/mysqlinnodb.html
http://thinkit.co.jp/free/article/0707/2/4/
よむべし
http://www.gashimax.com/wiki/index.php?MySQL%2F%A5%C1%A5%E5%A1%BC%A5%CB%A5%F3%A5%B0
SHOW STATUS
http://rfs.jp/sb/sql/s03/07-8.html
ORACLEが開発した負荷テストツール。現在開発終了。使う?
http://www.multiburst.net/sometime-php/2009/06/transaction-generator/
mysqldumpslow
slow queryをExPLAINで解析
slow query 出力方法
mysql> show variables like 'slow_query%'; +---------------------+---------------------------------+ | Variable_name | Value | +---------------------+---------------------------------+ | slow_query_log | OFF | | slow_query_log_file | /var/log/mysql/mariadb-slow.log | +---------------------+---------------------------------+ 2 rows in set (0.00 sec) mysql> show variables like 'long_query%'; +-----------------+-----------+ | Variable_name | Value | +-----------------+-----------+ | long_query_time | 10.000000 | +-----------------+-----------+ 1 row in set (0.00 sec) mysql> show variables like 'log_queries%'; +-------------------------------+-------+ | Variable_name | Value | +-------------------------------+-------+ | log_queries_not_using_indexes | OFF | +-------------------------------+-------+ 1 row in set (0.00 sec) mysql> set global slow_query_log = 1; Query OK, 0 rows affected (0.00 sec) mysql> set global long_query_time = 0.01; # 実行に0.01秒かかったSQL文を出力。0を指定するとすべてのクエリが出力する Query OK, 0 rows affected (0.00 sec) mysql> set global log_queries_not_using_indexes = 1; # フルスキャン(全件検索(SELECT * FROM)、全索引検索(SELECT COUNT (*) FROM ))したSQL文を実行時間にかかわらず出力する Query OK, 0 rows affected (0.00 sec)
EXPLAIN
実行計画(indexを使うか、どのindexを使うか)を確認するための構文

次のクエリを改善する必要がある
- type=ALL(全件検索)のクエリ
- type=index(全索引検索) key=PRIMARYのクエリ(InnoDBはクラスタインデックスのため)
http://nippondanji.blogspot.jp/2009/03/mysqlexplain.html
http://tech.aainc.co.jp/archives/4634
general_log(一般クエリログ)を取得
MariaDB [(none)]> SET GLOBAL general_log = 'ON'; #MySQL 5.1.12 から、ランタイムで一般クエリログを有効/無効にすることができるようになった
Query OK, 0 rows affected (0.01 sec)
MariaDB [(none)]> show variables like '%general_log%';
+------------------+---------------------+
| Variable_name | Value |
+------------------+---------------------+
| general_log | ON |
| general_log_file | general.log |
+------------------+---------------------+
2 rows in set (0.00 sec)
MariaDB [(none)]> quit
root@hostname:/home/admin# tail -f /var/lib/mysql/general.log # queryが流れる
140628 13:30:21 2390 Connect wordpressuser@localhost as anonymous on
2390 Query SET NAMES utf8
2390 Init DB techwordpress
2390 Query SELECT option_name, option_value FROM wp_options WHERE autoload = 'yes'
2390 Query SELECT option_value FROM wp_options WHERE option_name = 'akismet_comment_nonce' LIMIT 1
2390 Query SELECT option_value FROM wp_options WHERE option_name = 'widget_pages' LIMIT 1
# 表示内容は(開始時間-スレッドID-クエリ種類-SQL内容)
テーブルに保存することも可能(mysql.general_log)
MariaDB [(none)]> SET GLOBAL log_output = "TABLE";
Query OK, 0 rows affected (0.02 sec)
MariaDB [(none)]> show variables like '%log_output%';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| log_output | TABLE |
+---------------+-------+
1 row in set (0.03 sec)
MariaDB [mysql]> select * from general_log limit 4\G
*************************** 1. row ***************************
event_time: 2014-06-28 14:08:56.648096
user_host: [wordpressuser] @ localhost []
thread_id: 2455
server_id: 1
command_type: Connect
argument: wordpressuser@localhost as anonymous on
*************************** 2. row ***************************
event_time: 2014-06-28 14:08:56.648341
user_host: wordpressuser[wordpressuser] @ localhost []
thread_id: 2455
server_id: 1
command_type: Query
argument: SET NAMES utf8
*************************** 3. row ***************************
event_time: 2014-06-28 14:08:56.648525
user_host: wordpressuser[wordpressuser] @ localhost []
thread_id: 2455
server_id: 1
command_type: Init DB
argument: techwordpressuser
*************************** 4. row ***************************
event_time: 2014-06-28 14:08:56.652426
user_host: wordpressuser[wordpressuser] @ localhost []
thread_id: 2455
server_id: 1
command_type: Query
argument: SELECT option_name, option_value FROM wp_options WHERE autoload = 'yes'
参考URL
http://www.e-agency.co.jp/column/20121220.html
http://dream-web.info/2014/01/29/3233/