ラベル mysqlslap の投稿を表示しています。 すべての投稿を表示
ラベル mysqlslap の投稿を表示しています。 すべての投稿を表示

2019年4月10日水曜日

時々遅いデータベースはデータベースではありません...

だから私は最近更新されたMySQL 5、6がなぜ古い5.5より遅いのかを調べるように依頼されました。

それで私は標準変数やキャッシュなどを見回すことから始めました。

テストケースは、5.5よりも5.6で実行するのに約2倍の時間がかかる単純なルーチンでした。

ミックスに追加するために、5.6バージョンはInnodb_buffer_pool_sizeの2倍、そしてもちろん全体的にもっと多くのramを持っていました。

だから私はMySQLslapでいくつかのテストを始めました...

Mysqlslapテストでは5.6では遅くなります

5.6:
mysqlslap --defaults-file =。/。my.cnf --concurrency = 150 --iterations = 130 -query = / test.sql --create-schema = applicationdata --verbose
基準
すべてのクエリを実行するための平均秒数:0.028秒
すべてのクエリを実行するための最小秒数:0.019秒
すべてのクエリを実行する最大秒数:0.071秒
クエリを実行しているクライアントの数:150
1クライアントあたりの平均クエリ数:1

5.5:
mysqlslap --defaults-file =。/。my.cnf --concurrency = 150 --iterations = 130 --query = / test.sql --create-schema = applicationdata --verbose
基準
すべてのクエリを実行するための平均秒数:0.015秒
すべてのクエリを実行するための最小秒数:0.011秒
すべてのクエリを実行する最大秒数:0.024秒
クエリを実行しているクライアントの数:150
1クライアントあたりの平均クエリ数:1


これはすべて公開ベンチマークに反する
http://dimitrik.free.fr/blog/archives/2013/02/mysql-performance-mysql-56-ga-vs-mysql-55-32cores.html

だから私はディスクレベルをチェックしました -

5.6:
#dd if = / dev / zero of =テストbs = 1048576 count = 2048
2048 + 0レコード
2048 + 0レコード
2147483648バイト(2.1 GB)コピー、25.7401秒、83.4 MB /秒

#dd if =テスト= / dev / null bs = 1048576
2048 + 0レコード
2048 + 0レコード
2147483648バイト(2.1 GB)コピー、29.1527秒、73.7 MB /秒

5.5:
#dd if = / dev / zero of =テストbs = 1048576 count = 2048
2048 + 0レコード
2048 + 0レコード
2147483648バイト(2.1 GB)コピー、19.9214秒、108 MB /秒

#dd if =テスト= / dev / null bs = 1048576
2048 + 0レコード
2048 + 0レコード
2147483648バイト(2.1 GB)コピー、20.0243秒、107 MB /秒



ここで5.5のディスクはMySQLに関係なく遅くなります。 だからこの場合....ディスクの速度を固定するために見て.. MySQLは正常に動作しています。

2014年5月3日土曜日

の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) 

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

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