MySQL データベースドライバーのパフォーマンス比較



この記事のベンチマークは、2020年5月時点で最新のドライバーを使用して測定しました。

MySQL は「世界で最も人気のあるオープンソースデータベース」であり、堅牢で広く利用されているデータの格納・アクセス方法を提供しています。実際、 多くのクラウドおよびオンプレミスデータベース(MemSQL や Google Cloud SQL など)が MySQL インターフェースを採用しています。MySQL データに 他のアプリケーションから接続するために、いくつかのネイティブオープンソースドライバーが利用可能です。

この記事では、大規模なデータセットを扱う際のネイティブ MySQL Connector(JDBC および ODBC)1と CData Software JDBC および ODBC Driver for MySQL2の読み取りおよび書き込みパフォーマンスを比較します。 CData ドライバーは、ネイティブドライバーと比較して約20%高速に大規模データセットを読み取り、100万行の書き込みでは約40%高速であることを 示します。


データ



読み取りパフォーマンスの比較を再現可能な形で提供するために、Amazon Customer Reviews データセット3から米国のAmazon 書籍レビューを MySQL データベースにコピーしました。amazon_book_reviews テーブルの詳細は以下のとおりです:

テーブルサイズ     行数     カラム数
9.7 GB 10,534,179 15

JDBC ドライバー読み取りパフォーマンス



この調査の主な目的は、JDBC ドライバーの相対的なパフォーマンスを比較することでした。各 JDBC ドライバーで同じクエリセットを実行して比較を行いました。LIMIT 句を使用して各クエリで返されるデータセットのサイズを変更しましたが、各クエリで要求するカラムは同じにしています。

ベースクエリ

SELECT
	marketplace,
	customer_id,
	review_id,
	product_id,
	product_parent,
	product_title,
	product_category,
	star_rating,
	helpful_votes,
	total_votes,
	vine,
	verified_purchase,
	review_headline,
	review_body,
	review_date,
FROM
  cdata.amazon_book_reviews;

クエリ別の制限

  1. LIMIT 1000000
  2. フルデータセット

ドライバーをテストするために、基本的な Java アプリケーションを使用して MySQL に接続し、上記のクエリを繰り返し実行しました。結果は各行の各カラムに対して、データ型に基づいた新しい変数に読み込み・格納されました。

ドライバー別クエリ時間(秒)
クエリ CData JDBC Driver MySQL Connector/J
1(1,000,000 行) 14.02 (+26%) 17.67
2(約10,000,000 行) 171.09 (+20.7%) 206.42

結果からわかるように、CData ドライバーは一貫してネイティブ MySQL ドライバーを上回るパフォーマンスを発揮しました。これは主に CData JDBC ドライバーのクライアント側リソースの効率的な使用方法によるものです。

JDBC ドライバーリソース使用量

JDBC ドライバーの読み取りパフォーマンスをテストしながら、クライアント側のリソース使用量、特にメモリについても測定しました。以下のグラフは、サンプル Java プログラムを実行し、Java VisualVM を使用してメモリ使用量をキャプチャした結果です。Java OpenJDK バージョン12.0.2 を使用し、最大ヒープサイズを 8 GB に設定しました。

この比較では、フルデータセットに対するクエリを実行しました。

CData ドライバー

ネイティブドライバー*

* ヒープグラフのスケールが異なることにご注意ください。

CData ドライバーは実行期間を通じて平均約 150 MB のヒープ使用量を維持しています。一方、ネイティブドライバーは実行期間中にクライアントリソースを使い続けて増加していきます。実際、ネイティブ MySQL ドライバーが実行を完了するためには、最大ヒープサイズを 8 GB に設定する必要がありました。ネイティブドライバーが大幅に多くのリソースを使用しているにもかかわらず、データの読み取りには CData JDBC ドライバーよりも時間がかかっています。


ODBC ドライバー読み取りパフォーマンス



この調査の主な目的は、ODBC ドライバーの相対的なパフォーマンスを比較することでした。各 ODBC ドライバーで同じクエリセットを実行して比較を行いました。LIMIT 句を使用して各クエリで返されるデータセットのサイズを変更しましたが、各クエリで要求するカラムは同じにしています。

ベースクエリ

SELECT
	marketplace,
	customer_id,
	review_id,
	product_id,
	product_parent,
	product_title,
	product_category,
	star_rating,
	helpful_votes,
	total_votes,
	vine,
	verified_purchase,
	review_headline,
	review_body,
	review_date,
FROM
  cdata.amazon_book_reviews;

クエリ別の制限

  1. LIMIT 1000000
  2. フルデータセット

ドライバーをテストするために、基本的な C++ アプリケーションを使用して MySQL に接続し、上記のクエリを繰り返し実行しました。結果は各行の各カラムに対して、データ型に基づいた新しい変数に読み込み・格納されました。

ドライバー別クエリ時間(秒)
クエリ CData ODBC Driver MySQL Connector/ODBC
1(1,000,000 行) 14.95 (+96.7%) 29.40
2(約10,000,000 行) 177.51 (+72.3%) 305.77

結果からわかるように、CData ODBC ドライバーは MySQL Connector/ODBC を一貫して上回るパフォーマンスを発揮しました。これは主に利用可能なクライアントリソースの効率的な使用によるものです。

ODBC ドライバーリソース使用量

ODBC ドライバーの読み取りパフォーマンスをテストしながら、クライアント側のリソース使用量、特に処理能力とネットワーク帯域幅についても測定しました。以下のグラフは、シンプルな C++ アプリケーションを実行し、Windows リソースモニターを使用して取得した結果です。

この比較では、フルデータセットに対するクエリを実行しました。

CData ドライバー

ネイティブドライバー

両ドライバーとも利用可能な処理能力の 20 - 25% を使用しているようで、CData の方がやや高くなっています。より大きな違いはネットワーク帯域幅の使用量にあり、CData ドライバーは約 250Mbps を使用するのに対し、ネイティブドライバーは 100Mbps を使用しています。


100万行チャレンジ



読み取りパフォーマンスの測定に加えて、ドライバーの書き込みパフォーマンスも比較しました。結論として、CData MySQL JDBC ドライバーはネイティブ MySQL Connector より約40%高速に100万行を書き込むことができます。

シンプルな Java プログラムを使用して、上記で参照した amazon_book_reviews テーブルのコピーに行を追加しました3。テストでは、10,000行のバッチを100回に分けてデータを挿入しました。

サンプルコード

//one batch
Connection connection = DriverManager.getConnection("jdbc:mysql:server=" + myServer + ";port=" + myPort + ";user=" + myUser + ";password=" + myPassword + ";database=" + myDatabse + ";");
String cmd = "INSERT INTO cdata.amazon_book_reviews_insert (marketplace, customer_id, review_id, product_id, product_parent, product_title, product_category, star_rating, helpful_votes, total_votes, vine, verified_purchase, review_headline, review_body, review_date) VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)";
PreparedStatement pstmt = connection.prepareStatement(cmd);

for (int row = 0; row < rows.length; row++){
	pstmt.setString(1, marketplace);
	pstmt.setLong(2, customer_id);
	pstmt.setString(3, review_id);
	pstmt.setLong(4, product_id);
	pstmt.setLong(5, product_parent);
	pstmt.setString(6, product_title);
	pstmt.setString(7, product_category);
	pstmt.setLong(8, star_rating);
	pstmt.setLong(9, helpful_votes);
	pstmt.setLong(10, total_votes);
	pstmt.setString(11, vine);
	pstmt.setString(12, verified_purchase);
	pstmt.setString(13, review_headline);
	pstmt.setString(14, review_body);
	pstmt.setDate(15, review_date);

  pstmt.addBatch();
}

int[] affected = pstmt.executeBatch();

結果

100万行挿入にかかる時間(秒)
CData JDBC Driver MySQL Connector/J
77.6 127.9

まとめ



CData ドライバーは、利用可能なクライアントリソースをより効率的に活用することで、ネイティブコネクタより大規模データセットのクエリを少なくとも 20%高速に処理できます。

データ挿入においても、CData ドライバーは大規模データセットを高速に挿入する能力で際立っています。CData JDBC ドライバーは100万行を80秒未満で挿入でき、ネイティブコネクタより約40%高速です。

当社のエンジニアリングチームは SQL エンジンを最適化し、接続パフォーマンスがネットワークトラフィックとサーバー処理時間によってのみ制限される レベルにまで高めました。

参考資料



  1. MySQL Connectors
  2. CData ドライバー
  3. Amazon Customer Reviews Dataset

始める準備はできましたか?

MySQL 用ドライバーの詳細、または無料トライアルをダウンロード:

今すぐダウンロード