🦔
Trino を使って Amazon RDS MySQL とTiDB Serverless のテーブルをJoinした横断クエリを実行する
少し前にTrinoを使ってAmazon RDS MySQLへクエリの実行を行える環境を作成しました。
今日はさらに追加でTiDB Serverlessとの接続を行い、Amazon RDS MySQLとTiDB Serverlessのテーブルをjoinしてクエリを実行する環境を作成します。
さっそくやってみる
0-1. 環境準備 その1
を終わらせておきます。t2.microだと厳しいようでt2.mediumを使いました。
0-2. 環境準備その2 TiDB Serverless の起動とデータ投入
を参考にTiDB Serverlessを起動させ接続情報を手元にメモしておきます。その後テスト用スキーマなどを作成します。
CREATE DATABASE IF NOT EXISTS my_new_schema;
USE my_new_schema;
CREATE TABLE user_scores (
user_id INT PRIMARY KEY,
score INT
);
INSERT INTO user_scores (user_id, score)
VALUES
(1, 88),
(2, 92),
(3, 75);
1. Trinoの用Properties ファイルの作成 と TiDB クラスターの設定変更
./trino/etc/catalog/ にmysql用プロパティファイルが存在していますのでそちらをコピーします。
cp mysql.properties tidb.properties
TiDBはMySQL互換として接続しますが、ポート番号は4000となりますので注意しながら修正します。
サンプル
connector.name=mysql
connection-url=jdbc:mysql://gateway01.region.prod.aws.tidbcloud.com:4000
connection-user=xxxxx.root
connection-password=yyyyyy
その後Trinoを再起動します。
sudo docker stop trino
sudo docker rm trino
sudo docker run -d -p 8080:8080 --name trino \
-v ~/trino/etc/catalog:/etc/trino/catalog \
trinodb/trino
次にTiDB マネージメントコンソールのSQL Editorで以下を実行しておきます。
SET GLOBAL tidb_enable_noop_functions = 1;
TrinoはTiDBをMySQLとして認識していますが、TiDBとMySQLには一部差異があります。今回の例でいえばクエリはREAD ONLY
を含んで発行されますがそれに対応していないため明示的に無視を行う必要があります。
noop
とはno operation
の略であり、READ ONLY
はダミーとして受け付けて何もしない、という指示をTiDBに与えておく必要があります。
2. 2つのテーブルのJoin実行
SELECT
m.id, m.name, t.score
FROM
mysql.my_new_schema.users m
JOIN
tidb.my_new_schema.user_scores t
ON
m.id = t.user_id;
id | name | score
----+---------------+-------
1 | John Doe | 88
2 | Jane Smith | 92
3 | Alice Johnson | 75
(3 rows)
無事クエリが実行されました!
Discussion