ClickHouseとMySQLの連携方法を徹底比較!関数・Dictionary・エンジン・インターフェイス

目次

はじめに

ClickHouseは分析用途に優れた列志向データベースですが、既存のMySQLと組み合わせて利用したい場面も少なくありません。

前回の記事「PeerDB + ClickHouse + MySQL でCDC検証をしてみた話」で触れたように、がっつりCDCでMySQLからClickHouseへデータ同期をする手法もあります。

それとは別に、ClickHouseにはMySQLにデータを残したまま、MySQLのデータを参照するための方法が複数用意されており、それぞれ特徴や適した用途が異なります。

他方で、ClickHouseには、MySQLクライアントからClickHouseへ接続するための機能も用意されています。そのため、用途に応じてさまざまな形でMySQLと連携することができます。

本記事では、以下の5つの方法について実際に動作を確認し、それぞれの使いどころを比較します。

  • テーブル関数

  • Dictionary

  • テーブルエンジン

  • データベースエンジン

  • インターフェイス


全体比較

まずは、それぞれの機能の違いを整理します。

機能

用途

データの所在

ClickHouseで高速化できるか

テーブル関数

一時的なデータ参照

MySQL

❌ 高速化できない

Dictionary

マスタデータの高速参照

MySQL→ClickHouseメモリにキャッシュ

✅ 高速化できる

テーブルエンジン

継続的なテーブル利用

MySQL

❌ 高速化できない

データベースエンジン

継続的なスキーマ利用

MySQL

❌ 高速化できない

インターフェイス

MySQLクライアントからの接続

ClickHouse

✅ ClickHouseがSQLを処理

前半の4つはClickHouseからMySQLのデータを利用するための機能であるのに対し、インターフェイスはMySQLクライアントからClickHouseへ接続するための機能という点が大きな違いです。


検証環境

項目

バージョン

ClickHouse

26.6.1.1193

MySQL Community Server

8.4.9


環境構築

今回はDockerでMySQLとClickHouseを構築します。

ネットワーク

最初にDockerネットワークを作成し、その後に各コンテナを接続します。

ClickHouse

マウントしている設定ファイルの内容については後ほど説明します。

MySQL

SakilaサンプルデータベースをMySQLにインポートします。

ClickHouseからの接続用ユーザを作成します。


テーブル関数

公式ドキュメント:mysql | ClickHouse Docs

テーブル関数は、SQL実行時に直接MySQLへ接続してデータを取得する方法です。

テーブルを作成する必要がなく、一時的な参照やデータ確認に適しています。

一方で、クエリ実行のたびにMySQLへアクセスするため、Dictionaryのようなキャッシュは行われません。


名前付きコレクション

公式ドキュメント:名前付きコレクション | ClickHouse Docs

個々のSQLへ接続情報を直接記述する代わりに、名前付きコレクションを利用して接続設定を外部化し、より安全で再利用しやすい形に書き換えることができます。

名前付きコレクションの作成

クエリを書き換えた場合

Dictionary

公式ドキュメント:MySQL Dictionary ソース | ClickHouse Docs

Dictionaryは、外部データをキー検索用途に最適化した機能です。

一度読み込んだデータはキャッシュされるため、小さなマスタデータを高速に参照したい場合によく利用されます。

マスタのように更新頻度が低く、参照頻度が高いテーブルと相性が良い機能です。

名前付きコレクションで書き換えた場合(8行目)

今回設定しているLIFETIMEはDictionaryの更新間隔を表しています。

今回の設定では最大300秒間キャッシュされるため、MySQL側で更新があっても即座には反映されません。

リアルタイム性が必要な場合はこの値を考慮して設定する必要があります。

辞書からキーを元に値を取り出すときは、dictGet()関数を使用します。

JOIN風に行うとこのような形になります。


テーブルエンジン

公式ドキュメント:MySQL と ClickHouse の統合 | ClickHouse Docs

テーブルエンジンは、MySQL上のテーブルをClickHouseのテーブルとして扱える機能です。

CREATE TABLEを一度実行しておけば、通常のClickHouseテーブルと同じ感覚で利用できます。

継続的に参照するテーブルではテーブル関数より扱いやすいケースが多くあります。

名前付きコレクションで書き換えた場合


データベースエンジン

公式ドキュメント:MySQL | ClickHouse Docs

データベースエンジンは、MySQL上のスキーマをClickHouseのスキーマとして扱える機能です。

テーブルごとにエンジンを定義する必要がなく、多数のテーブルをまとめて扱いたい場合に便利です。

名前付きコレクションで書き換えた場合


インターフェイス

公式ドキュメント:MySQL インターフェイス | ClickHouse Docs

ここまで紹介した4つの機能は、ClickHouseからMySQLのデータを参照する機能でした。

一方でClickHouseには、MySQLクライアントからClickHouseへ接続するための機能も用意されています。

これはMySQL Serverとして動作するわけではなく、MySQLクライアントが利用する通信プロトコルをClickHouseが実装している機能です。

そのため、普段利用している

  • MySQLクライアント

  • BIツール(Looker Studio、Tableau Online、QuickSight)

など、MySQLプロトコルに対応したツールからClickHouseへ接続できます。

イメージとしては以下のようになります。

設定方法

インターフェイスが使用するポート設定をClickHouseサーバーの構成ファイルに追加する必要があります。

以下のXMLファイルを作成し、コンテナ作成時に/etc/clickhouse-server/config.d/mysql.xmlにマウントしました。

mysql.xml

接続用ユーザーを作成

実運用では、必要最小限の権限のみを付与したユーザーを利用することを推奨します。


 

MySQLクライアントから接続する

MySQLクライアントから以下のようにClickHouseへ接続してみます。

ここでServer version表示からも分かるように、接続先はMySQLではなくClickHouseです。 MySQLクライアントを利用していますが、実際にSQLを処理しているのはClickHouseになります。

そのため、ClickHouse固有のSQLや関数も使用できます。

試しに、テーブル関数をクエリしてみます。

利用時の注意点

インターフェイスは便利な機能ですが、いくつか注意点があります。

  • MySQL固有のSQLやコマンドがすべて利用できるわけではない

  • ClickHouse固有のSQLや関数が利用できる

  • ClickHouseセルフマネージド版の場合、接続ポートは通常のMySQL(3306)ではなく、デフォルトでは9004を使用する

そのため、「MySQLクライアントでClickHouseを操作するための互換機能」と理解しておくと混乱しません。


まとめ

本記事では、ClickHouseとMySQLを連携する5つの方法を紹介しました。

前半の4つ(テーブル関数、Dictionary、テーブルエンジン、データベースエンジン)は、ClickHouseからMySQLのデータを利用するための機能です。 一方、インターフェイスは、MySQLクライアントやMySQLプロトコル対応のGUIツールからClickHouseへ接続するための機能であり、用途が異なります。

それぞれ目的や仕組みが異なるため、利用シーンに応じて適切な機能を選択することが重要です。

ClickHouseは分析基盤として利用されることが多い一方で、このようなMySQL連携機能を活用することで、既存のMySQL環境と組み合わせた柔軟なシステム構成を実現できます。 用途に応じて各機能を使い分けることで、ClickHouseをより効果的に活用できるでしょう。

スマートスタイルTECHブログについて

スマートスタイルTECHブログでは、日頃MySQLのサポート業務に従事している有資格者で構成された技術サポートチームがMySQLに関する技術情報を発信しています。データベースのお困りごとはお気軽にご相談下さい。

よかったらシェアしてね!
  • URLをコピーしました!
目次