Saturday, May 3, 2014

のmysqlslapとMySQLベンチマーク

Original post: http://anothermysqldba.blogspot.com/2014/05/mysql-benchmark-with-mysqlslap.html

だからあなたのデータベースに対して様々なMySQLクエリをベンチマーキングするのは非常に賢明なことです。 それは言うまでもない。 我々は最適化しながら、我々は彼らに彼らが参考に証明する必要があり、ベンチマークするために時間を割いEXPLAIN(および拡張EXPLAIN)を使用することができます最善を照会します。 

これはのmysqlslap文を実行する簡単な例です。 

この例では、私は、MySQLからのworldデータベースをロードしました。 http://dev.mysql.com/doc/index-other.html ) 

私はすべての3つのテーブルを結合し、クエリを作成し、/ tmpに/ tests.sqlに入れて。 実行計画は以下の通りです。 

root@localhost [world]> EXPLAIN EXTENDED SELECT C.Name as City, Y.Name as Country, L.Language,Y.Population FROM City C INNER JOIN Country Y ON C.CountryCode = Y.Code INNER JOIN CountryLanguage L ON C.CountryCode = L.CountryCode WHERE C.Name LIKE 'D%' AND Y.Continent='Europe' \G
*************************** 1. row ***************************
id: 1
select_type: SIMPLE
table: C
type: range
possible_keys: CountryCode,name_key
key: name_key
key_len: 5
ref: NULL
rows: 127
filtered: 100.00
Extra: Using where
*************************** 2. row ***************************
id: 1
select_type: SIMPLE
table: Y
type: eq_ref
possible_keys: PRIMARY
key: PRIMARY
key_len: 3
ref: world.C.CountryCode
rows: 1
filtered: 100.00
Extra: Using where
*************************** 3. row ***************************
id: 1
select_type: SIMPLE
table: L
type: ref
possible_keys: PRIMARY,CountryCode
key: CountryCode
key_len: 3
ref: world.C.CountryCode
rows: 2
filtered: 100.00
Extra: Using index
3 rows in set, 1 warning (0.00 sec)

root@localhost [world]> show warnings \G
*************************** 1. row ***************************
Level: Note
Code: 1003
Message: /* select#1 */ select `world`.`C`.`Name` AS `City`,`world`.`Y`.`Name` AS `Country`,`world`.`L`.`Language` AS `Language`,`world`.`Y`.`Population` AS `Population` from `world`.`City` `C` join `world`.`Country` `Y` join `world`.`CountryLanguage` `L` where ((`world`.`Y`.`Code` = `world`.`C`.`CountryCode`) and (`world`.`L`.`CountryCode` = `world`.`C`.`CountryCode`) and (`world`.`Y`.`Continent` = 'Europe') and (`world`.`C`.`Name` like 'D%'))


今のmysqlslapツールは、MySQL 5.1.4から存在しています 
以下にいくつかの他の有用なリンクがあります。 
今、私は私のクエリを持っていることを、私は、次のコマンドを使用してデータベースに対するベンチマークそれはすることができます。 

のmysqlslap - 同時実行性= 150 - 反復= 50 - クエリ=を/ tmp / test.sql内 - 作成 - スキーマ=世界 

一つ注意: 
問合せは、ツールが簡単にエラーの場合と同様に、非常にきれいである必要があります。 
例えば以下は、このエラーを投​​げ: 

SELECT C.Name as City, Y.Name as Country, L.Language,Y.Population
FROM City C
INNER JOIN Country Y ON C.CountryCode = Y.Code
INNER JOIN CountryLanguage L ON C.CountryCode = L.CountryCode
WHERE C.Name LIKE 'D%' AND Y.Continent='Europe' 

このクエリはうまく働いている間。 

SELECT C.Name as City, Y.Name as Country, L.Language,Y.Population FROM City C INNER JOIN Country Y ON C.CountryCode = Y.Code INNER JOIN CountryLanguage L ON C.CountryCode = L.CountryCode WHERE C.Name LIKE 'D%' AND Y.Continent='Europe' 


あなたのためのツールが出力ベンチマーク結果 


Benchmark
Average number of seconds to run all queries: 0.104 seconds
Minimum number of seconds to run all queries: 0.096 seconds
Maximum number of seconds to run all queries: 0.141 seconds
Number of clients running queries: 150
Average number of queries per client: 1 


のmysqlslap - ヘルプは、あなたとあなたのクエリをテストするための多数のオプションを提供します。 

あなたは、自動的にすべてを行うことができます 

# mysqlslap --auto-generate-sql
Benchmark
Average number of seconds to run all queries: 0.243 seconds
Minimum number of seconds to run all queries: 0.243 seconds
Maximum number of seconds to run all queries: 0.243 seconds
Number of clients running queries: 1
Average number of queries per client: 0 


あなたにも挿入をテストすることができます。 たとえば、私は、この表を作成しました: 

CREATE TABLE `foobar_table` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`time_recorded` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`id`)
) ENGINE=InnoDB ; 


それでは、次のようにテストされています。 

# mysqlslap --concurrency=1150 --iterations=530 --query="use test;insert into foobar_table (id) values (null)" --delimiter=";"
mysqlslap: Could not create thread 


OKエラーは非常に有用ではありません...しかし、うまくいけば、エラーに気づく。 あなただけの530回の繰り返しを持っている場合、それは1150年の同時トランザクションを持つことは難しいです。 


# mysqlslap --concurrency=150 --iterations=30 --query=/tmp/test1.sql --create-schema=test --verbose
Benchmark
Average number of seconds to run all queries: 0.260 seconds
Minimum number of seconds to run all queries: 0.192 seconds
Maximum number of seconds to run all queries: 0.476 seconds
Number of clients running queries: 150
Average number of queries per client: 1


例えば以下は、はるかに優れていました。 

# mysqlslap --concurrency=200 --iterations=1000 --query=" insert into foobar_table (id) values (null)" --verbose --create-schema=test
Benchmark
Average number of seconds to run all queries: 0.282 seconds
Minimum number of seconds to run all queries: 0.217 seconds
Maximum number of seconds to run all queries: 0.726 seconds
Number of clients running queries: 200
Average number of queries per client: 1 


ちょうど私達が実際の挿入を行っていることを証明する.. 

root@localhost [test]> select count(id) from foobar_table;
+-----------+
| count(id) |
+-----------+
| 206091 |
+-----------+
1 row in set (0.13 sec) 

今、私はまた、これは私がブログの記事で使用するだけでテスト·データベースであることを言う必要がありますので、これらの結果と照らし合わせて本番データベースを評価しません。

私は、面倒なクエリを見つける...このすべての直後にポイントを推測、それはあなたができる最善の最適化、およびベンチマークそれ。 それだけではなく推測の自分の限界を知っている方がよい。