sysbenchでMySQLとMariaDBのパフォーマンスを比較する
MySQLとMariaDBを同じテーブル内の複数スレッドでバッチ挿入を使用してベンチマークする
このガイドでは、sysbench
というツールを使用して、MySQLとMariaDBの性能を比較する方法を説明します。sysbench
は、データベースシステムのパフォーマンスをベンチマークするためのオープンソースツールです。このガイドでは、同じテーブルに複数のスレッドからバッチ挿入を行うシナリオに焦点を当てます。
前提知識
このガイドを理解するには、以下の知識が必要です。
sysbench
ツールの基本的な知識- コマンドラインインターフェースの使用経験
- MySQL または MariaDB の基本的な知識
手順
sysbenchをインストールする
sysbench
は、多くのLinuxディストリビューションでパッケージとして利用できます。以下のコマンドを使用してインストールできます。sudo apt install sysbench
ベンチマーク対象のデータベースを作成する
以下のコマンドを使用して、ベンチマーク対象のデータベースを作成します。
mysql -u root -p -e 'CREATE DATABASE test'
mysql -u root -p test << EOF CREATE TABLE data ( id INT PRIMARY KEY AUTO_INCREMENT, name VARCHAR(255) NOT NULL, email VARCHAR(255) NOT NULL ); EOF
sysbench設定ファイルを作成する
以下の内容の
sysbench.lua
という名前のファイルをを作成します。local prepare = function() -- データベース接続 db = mysql:connect({ host = "localhost", port = 3306, user = "root", password = "", database = "test", }) -- テーブル作成 db:query("CREATE TABLE data (id INT PRIMARY KEY AUTO_INCREMENT, name VARCHAR(255) NOT NULL, email VARCHAR(255) NOT NULL)") end local do_inserts = function() -- バッチ挿入 local batch_size = 1000 for i = 1, 10000 do local values = {} for j = 1, batch_size do values[#values + 1] = "(" .. i .. ",'" .. string.sub(uuid(), 1, 36) .. "','" .. string.sub(uuid(), 1, 36) .. "')" end db:query("INSERT INTO data (id, name, email) VALUES " .. table.concat(values, ",")) end end local cleanup = function() -- データベース接続を閉じる db:close() end return { prepare = prepare, do_inserts = do_inserts, cleanup = cleanup, }
MySQLをベンチマークする
以下のコマンドを使用して、MySQLをベンチマークします。
sysbench --test=lua --lua-script=sysbench.lua --table-size=1000000 --thread-count=16 --max-requests=1000000 run
このコマンドは、
sysbench.lua
スクリプトで定義されているprepare
、do_inserts
、cleanup
関数をそれぞれ1回実行します。--table-size
オプションは、テーブルに挿入するレコード数を100万に設定します。--thread-count
オプションは、使用スレッド数を16に設定します。--max-requests
オプションは、各スレッドが実行するクエリ数を100万に設定します。MariaDBをベンチマークする
sysbench --test=lua --lua-script=sysbench.lua --table-size=1000000 --thread-count=16 --max-requests=1000000 --db-driver=mariadb run
このコマンドは、MySQLをベンチマークする場合と同じ引数を使用して、MariaDBをベンチマークします。
結果を分析する
sysbench
は、ベンチマークの実行後に以下の情報を表示します。- スループット: 秒あたりのトランザクション数
- レイテンシー: 各トランザクションの平均実行時間
local prepare = function()
-- データベース接続
db = mysql:connect({
host = "localhost",
port = 3306,
user = "root",
password = "",
database = "test",
})
-- テーブル作成
db:query("CREATE TABLE data (id INT PRIMARY KEY AUTO_INCREMENT, name VARCHAR(255) NOT NULL, email VARCHAR(255) NOT NULL)")
end
local do_inserts = function()
-- バッチ挿入
local batch_size = 1000
for i = 1, 10000 do
local values = {}
for j = 1, batch_size do
values[#values + 1] = "(" .. i .. ",'" .. string.sub(uuid(), 1, 36) .. "','" .. string.sub(uuid(), 1, 36) .. "')"
end
db:query("INSERT INTO data (id, name, email) VALUES " .. table.concat(values, ","))
end
end
local cleanup = function()
-- データベース接続を閉じる
db:close()
end
return {
prepare = prepare,
do_inserts = do_inserts,
cleanup = cleanup,
}
このコードは以下の説明の通りです。
cleanup
関数: この関数は、ベンチマークの実行後に実行されます。この関数では、データベース接続を閉じます。do_inserts
関数: この関数は、ベンチマークの実行中に実行されます。この関数では、同じテーブルに複数のスレッドからバッチ挿入を行います。prepare
関数: この関数は、ベンチマークの実行前に実行されます。この関数では、データベースへの接続と、ベンチマーク対象のテーブルの作成を行います。
このコードを以下のコマンドを使用して実行できます。
sysbench --test=lua --lua-script=sysbench.lua --table-size=1000000 --thread-count=16 --max-requests=1000000 run
- MySQLTuner: MySQLTunerは、MySQLのパフォーマンスを改善するためのヒントを提供するオープンソースツールです。MySQLTunerを使用して、データベース設定を分析し、パフォーマンスを向上させることができます。
- Performance Schema: Performance Schemaは、MySQLとMariaDBに組み込まれたパフォーマンス監視ツールです。Performance Schemaを使用して、データベースのパフォーマンスに関するさまざまなメトリックを収集できます。
どのツールを使用するかは、要件と好みによって異なります。sysbench
は、シンプルで使いやすいベンチマークツールです。db-bench-toolは、より多くの機能を備えたより高度なベンチマークツールです。Performance Schemaは、データベースのパフォーマンスに関する詳細な情報を収集したい場合に役立ちます。MySQLTunerは、MySQLのパフォーマンスを向上させるのに役立ちます。wrkは、WebサーバーのフロントエンドとしてMySQLまたはMariaDBを使用している場合に役立ちます。
ベンチマークを実行する際に考慮すべき事項
ベンチマークを実行する際には、以下の点に注意する必要があります。
- メトリクス: ベンチマークでは、関連するすべてのメトリックを収集する必要があります。
- ソフトウェア: ベンチマークは、本番環境と同じソフトウェアで実行する必要があります。
- ワークロード: ベンチマークは、実際のワークロードをできる限り反映する必要があります。
mysql mariadb benchmarking