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;
クエリ別の制限
- LIMIT 1000000
- フルデータセット
ドライバーをテストするために、基本的な 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 ドライバーは実行期間を通じて平均約 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;
クエリ別の制限
- LIMIT 1000000
- フルデータセット
ドライバーをテストするために、基本的な 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 リソースモニターを使用して取得した結果です。
この比較では、フルデータセットに対するクエリを実行しました。
両ドライバーとも利用可能な処理能力の 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 エンジンを最適化し、接続パフォーマンスがネットワークトラフィックとサーバー処理時間によってのみ制限される レベルにまで高めました。



