MySQL 8.0.18 の Hash Join について検証してみた

こんにちは。サイオステクノロジー OSS サポート担当 Y です。

今回は MySQL 8.0.18 で実装された Hash Join について検証してみました。(※以下の内容は MySQL 8.0.17/MySQL 8.0.18 にて検証しています。)

■はじめに

MySQL 8.0 では、様々な新機能が追加されています。

普段の業務では PostgreSQL を扱うことが多いのですが、最近 MySQL に Hash Join が実装されたという話を聞いたので、今回はこの Hash Join について検証してみました。

■MySQL 8.0.18 (Hash Join 実装) にて検証

それではさっそく検証してみます。

まずは、以下の様にテスト用のテーブル t1 と t2 を作成します。

作成したテーブル t1 にテスト用のデータ (ランダムに生成された 20文字の文字列) を 16384 レコードほど格納します。

t2 についても同様に、テスト用のデータ (ランダムに生成された 20文字の文字列) を 16384 レコードほど格納します。

上記 2つのテーブル t1 と t2 について、以下の様なクエリ (EXPLAIN ANALYZE) を実行してみます。

すると、実行計画に “Inner hash join” と出力されており、Hash Join が実行されていることが確認できます。

また、(後述する MySQL 8.0.17 との比較のために) SELECT * FROM t1 INNER JOIN t2 ON t1.a = t2.a を何度か実行してみました。

上記の様に、実行時間はおよそ 0.05 sec ~ 0.10 sec という結果になりました。

■MySQL 8.0.17 (Hash Join 未実装のバージョン) にて検証

バージョンや作成するテストデータ (ランダムな文字列) の内容が異なっているため一概に比較することはできませんが、試しに MySQL 8.0.17 で同じ様なクエリを実行した際の実行時間について検証してみました。

先程と同じ様に、テスト用のテーブル t1 と t2 を作成します。

こちらも先程と同様に、各テーブルにテスト用のデータ (ランダムに生成された 20文字の文字列) を 16384 レコードほど格納します。

この 2つのテーブル t1 と t2 に対して、SELECT * FROM t1 INNER JOIN t2 ON t1.a = t2.a を何度か実行してみました。(MySQL 8.0.17 以前のバージョンでは Nested Loop Join が実行されます)

すると、実行時間はおよそ 40 sec 前後という結果になりました。

バージョンやテストデータ (ランダムな文字列) の内容に差異があるため一概に比較することはできませんが、Hash Join がより適切なクエリに関しては、MySQL 8.0.17 (Nested Loop Join) に比べて MySQL 8.0.18 (Hash Join) の方が性能が上がっている様です。

■最後に

今回は MySQL 8.0.18 で実装された Hash Join について検証してみました。

今回検証した Hash Join 以外にも、前回検証した CHECK 制約や CTE, GIS 等、MySQL 8.0 では様々な機能が追加/強化されており、MySQL を適用できる幅が更に広がっているのではないでしょうか。今後も MySQL のリリースに注目していきたいと思います。

>> 雑誌等の執筆依頼を受付しております。
   ご希望の方はお気軽にお問い合わせください!

ご覧いただきありがとうございます! この投稿はお役に立ちましたか?

役に立った 役に立たなかった

0人がこの投稿は役に立ったと言っています。

コメント投稿

メールアドレスは表示されません。


*