PolarDB は、外部テーブルを使用して Object Storage Service (OSS) 内の CSV 形式のデータを直接クエリできるため、ストレージコストを削減できます。このトピックでは、外部テーブルを使用して OSS 内のデータにアクセスする方法について説明します。
前提条件
ご利用の PolarDB クラスターは、次のいずれかの要件を満たす必要があります:
エンジンバージョンが MySQL 8.0.1 で、リビジョンが 8.0.1.1.25.4 以降。
エンジンバージョンが MySQL 8.0.2 で、リビジョンが 8.0.2.2.1 以降。
エンジンバージョンの確認方法については、「エンジンバージョンのクエリ」をご参照ください。
仕組み
OSS 外部テーブルを使用すると、クエリ頻度の低い CSV 形式のデータ (コールドデータ) を OSS に保存し、クエリや分析を行うことができます。
制限事項
OSS 外部テーブルは、CSV ファイルのデータのみをクエリできます。
OSS 外部テーブルは、`CREATE`、`SELECT`、`DROP` 文のみをサポートします。
説明`DROP` 操作は、PolarDB 内のテーブルメタデータを削除するだけで、OSS 内のデータファイルは削除しません。
OSS 外部テーブルは、インデックス、パーティショニング、トランザクションをサポートしていません。
CSV 形式のデータでサポートされているデータ型には、数値型、日時型、文字列型、NULL 値が含まれます。
説明地理空間データ型はサポートされていません。
圧縮された CSV ファイルはクエリできません。
NULL 値は、次のいずれかの条件を満たす場合にのみサポートされます:
カーネルバージョンが MySQL 8.0.1 で、リビジョンが 8.0.1.1.28 以降。
カーネルバージョンが MySQL 8.0.2 で、リビジョンが 8.0.2.2.5 以降。
数値型
型
サイズ
符号付き範囲
符号なし範囲
説明
TINYINT
1 バイト
-128 から 127
0 から 255
非常に小さい整数。
SMALLINT
2 バイト
-32768 から 32767
0 から 65535
小さい整数。
MEDIUMINT
3 バイト
-8388608 から 8388607
0 から 16777215
中程度のサイズの整数。
INT または INTEGER
4 バイト
-2147483648 から 2147483647
0 から 4294967295
標準的な整数。
BIGINT
8 バイト
-9,223,372,036,854,775,808 から 9,223,372,036,854,775,807
0 から 18,446,744,073,709,551,615
大きい整数。
FLOAT
4 バイト
-3.402823466E+38 から -1.175494351E-38; 0; 1.175494351E-38 から 3.402823466E+38
0; 1.175494351E-38 から 3.402823466E+38
単精度浮動小数点数。
DOUBLE
8 バイト
-1.7976931348623157E+308 から -2.2250738585072014E-308; 0; 2.2250738585072014E-308 から 1.7976931348623157E+308
0; 2.2250738585072014E-308 から 1.7976931348623157E+308
倍精度浮動小数点数。
DECIMAL
DECIMAL(M,D) の場合、サイズは M > D であれば M+2 バイト、そうでなければ D+2 バイトです。
M と D の値に依存します。
M と D の値に依存します。
10 進数。
日時型
型
サイズ
範囲
フォーマット
説明
DATE
3 バイト
1000-01-01 から 9999-12-31
YYYY-MM-DD
日付値。
TIME
3 バイト
-838:59:59 から 838:59:59
HH:MM:SS
時間値または持続時間。
YEAR
1 バイト
1901 から 2155
YYYY
年値。
DATETIME
8 バイト
1000-01-01 00:00:00 から 9999-12-31 23:59:59
YYYY-MM-DD HH:MM:SS
日付と時刻を組み合わせた値。
説明このデータ型では、月と日を 2 桁の数字にする必要があります。たとえば、`2020-1-1` ではなく `2020-01-01` と指定します。そうしないと、クエリが OSS にプッシュダウンされたときに失敗します。
TIMESTAMP
4 バイト
1970-01-01 00:00:00 から 2038-01-19 03:14:07
YYYY-MM-DD HH:MM:SS
タイムスタンプ。日付と時刻を組み合わせた値です。
説明このデータ型では、月と日を 2 桁の数字にする必要があります。たとえば、`2020-1-1` ではなく `2020-01-01` と指定します。そうしないと、クエリが OSS にプッシュダウンされたときに失敗します。
文字列型
型
サイズ
説明
CHAR
0 から 255 バイト
固定長文字列。
VARCHAR
0 から 65,535 バイト
可変長文字列。
TINYBLOB
0 から 255 バイト
最大長 255 文字のバイナリ文字列。
TINYTEXT
0 から 255 バイト
短いテキスト文字列。
BLOB
0 から 65,535 バイト
バイナリ形式の長いテキストデータ。
TEXT
0 から 65,535 バイト
長いテキストデータ。
MEDIUMBLOB
0 から 16,777,215 バイト
バイナリ形式の中程度の長さのテキストデータ。
MEDIUMTEXT
0 から 16,777,215 バイト
中程度の長さのテキストデータ。
LONGBLOB
0 から 4,294,967,295 バイト
バイナリ形式の特大テキストデータ。
LONGTEXT
0 から 4,294,967,295 バイト
特大テキストデータ。
NULL 値
挿入
OSS 外部テーブルに NULL 値を挿入する。
OSS 外部テーブルに NULL 値を挿入するには、テーブル作成時に対応する NULL 値マーカーである
NULL_MARKERを指定します。OSS 外部テーブルのNULL_MARKERはデフォルトで NULL です。SHOW CREATE TABLE文を実行して NULL 値マーカーを表示できます:SHOW CREATE TABLE t1;次の結果が返されます:
+-------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | Table | Create Table | +-------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | t1 | CREATE TABLE `t1` ( `id` int(11) DEFAULT NULL ) ENGINE=CSV DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci /*!99990 800020204 NULL_MARKER='NULL' */ CONNECTION='server_name' | +-------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ 1 row in set (0.00 sec)CSV ファイルに NULL 値を挿入する。
CSV ファイルのフィールドに
NULL_MARKERを挿入し、NULL_MARKERが二重引用符で囲まれていない場合、PolarDB はその値を NULL として認識します。説明NULL_MARKERを二重引用符で囲むと、PolarDB はそれを文字列として認識します。その結果、is_null文を使用して NULL 値を見つけることができず、CSV ファイルで NULL 値が割り当てられたパラメーターが OSS 外部テーブルの対応するパラメーターのデータ型と一致しない場合はエラーが報告されます。NULL_MARKERは、数値、空の文字列、または次のいずれかの文字を含むことはできません:"、\n、\r、および,
例
次の文を使用して OSS 外部テーブルを作成します:
CREATE TABLE `t1` ( `id` int(11) DEFAULT NULL, `name` varchar(20) DEFAULT NULL, `time` timestamp NULL DEFAULT NULL ) ENGINE=CSV NULL_MARKER='NULL' CONNECTION='server_name';データファイルに次の内容が含まれていると仮定します:
1,"xiaohong","2022-01-01 00:00:00" NULL,"xiaoming","2022-02-01 00:00:00" 3,NULL,"2022-03-01 00:00:00" 4,"xiaowang",NULLOSS 外部テーブルをクエリすると、次のデータが返されます:
SELECT * FROM t1; +------+----------+---------------------+ | id | name | time | +------+----------+---------------------+ | 1 | xiaohong | 2022-01-01 00:00:00 | | NULL | xiaoming | 2022-02-01 00:00:00 | | 3 | NULL | 2022-03-01 00:00:00 | | 4 | xiaowang | NULL | +------+----------+---------------------+
読み取り
CSV ファイルからデータが読み取られる際、CSV ファイル内の値が NULL で、OSS 外部テーブルの対応する列が NULL を許容する場合、その列は NULL に設定されます。
NOT NULL として定義された列に対して CSV ファイルから NULL 値が読み取られると、競合が発生します。結果は SQL モードによって異なります。
sql_modeがSTRICT_TRANS_TABLESに設定されている場合、エラーが報告されます。sql_modeがSTRICT_TRANS_TABLES以外のモードに設定されている場合、列は定義されたデフォルト値に設定されます。デフォルト値が定義されていない場合は、そのデータ型の MySQL のデフォルト値に設定されます。詳細については、「データ型のデフォルト値」をご参照ください。警告も返されます。SHOW WARNINGS;コマンドを使用して警告の詳細を表示します。
説明現在の SQL モードを表示するには、
SHOW VARIABLES LIKE "sql_mode";コマンドを使用します。また、PolarDB コンソールに移動して、 ページでsql_modeパラメーターを変更することもできます。詳細については、「パラメーターの変更」をご参照ください。例
idカラムが NOT NULL であり、デフォルト値がないtという名前の OSS 外部テーブルを作成します。CREATE TABLE `t` ( `id` int(11) NOT NULL ) ENGINE=CSV CONNECTION="server_name";CSV ファイル
t.CSVに次の内容が含まれていると仮定します:NULL 2OSS 外部テーブルを使用して CSV ファイルからデータを読み取る際に、次の 2 つのシナリオが発生する可能性があります:
sql_modeがSTRICT_TRANS_TABLESに設定されている場合、次のコマンドを実行して CSV ファイルからデータをクエリします:SELECT * FROM t;次のエラーメッセージが報告されます:
ERROR 1364 (HY000): Field 'id' doesn't have a default valuesql_modeがSTRICT_TRANS_TABLES以外のモードに設定されている場合、次のコマンドを実行して CSV ファイルからデータをクエリします:SELECT * FROM t;次の結果が返されます:
+----+ | id | +----+ | 0 | | 2 | +----+ 2 rows in set, 1 warning (0.00 sec)結果の 0 は MySQL のデフォルト値です。次のコマンドを実行して警告メッセージを表示します:
SHOW WARNINGS;以下の結果が返されます。
+---------+------+-----------------------------------------+ | レベル | コード | メッセージ | +---------+------+-----------------------------------------+ | 警告 | 1364 | 'id' フィールドにはデフォルト値がありません | +---------+------+-----------------------------------------+ セット内に 1 行 (0.00 秒)
パラメーター
PolarDB コンソールの ページで、次のパラメーターを表示または変更できます:
パラメーター | スコープ | 説明 |
loose_csv_oss_buff_size | セッション | 単一の OSS スレッドが使用できるメモリ量をバイト単位で設定します。デフォルト値は 134217728 です。 有効な値:4096 から 134217728 |
loose_csv_max_oss_threads | グローバル | 同時実行可能な OSS スレッドの最大数を設定します。デフォルト値は 1 です。 有効な値:1 から 100 |
OSS 機能の最大合計メモリは、loose_csv_max_oss_threads * loose_csv_oss_buff_size として計算されます。
メモリ不足の問題を防ぐため、OSS 機能の合計メモリは現在のノードのメモリの 5% を超えないようにしてください。
操作手順
OSS サーバーの作成
OSS サーバーを作成して接続情報を追加し、OSS に接続します。
セキュリティ上の理由から、OSS への接続方法は OSS サーバーの作成のみがサポートされています。
新しいバージョン
ご利用のデータベースクラスターが次のいずれかの条件を満たす場合は、次の構文を使用します:
カーネルバージョンが MySQL 8.0.1 で、リビジョンが 8.0.1.1.28 以降。
カーネルバージョンが MySQL 8.0.2 で、リビジョンが 8.0.2.2.5 以降。
CREATE SERVER <server_name>
FOREIGN DATA WRAPPER oss OPTIONS
(
[DATABASE '<my_database_name>',]
EXTRA_SERVER_INFO '{"oss_endpoint": "<my_oss_endpoint>","oss_bucket": "<my_oss_bucket>","oss_access_key_id": "<my_oss_access_key_id>","oss_access_key_secret": "<my_oss_access_key_secret>","oss_prefix":"<my_oss_prefix>","oss_sts_token":"<my_oss_sts_token>"}'
);オプションの
DATABASEパラメーターはoss_prefixと同等です。oss_prefixの使用を推奨します。oss_sts_tokenパラメーターを使用するには、次のいずれかの条件を満たす必要があります:カーネルバージョンが MySQL 8.0.1 で、リビジョンが 8.0.1.1.29 以降。
カーネルバージョンが MySQL 8.0.2 で、リビジョンが 8.0.2.2.6 以降。
次の表にパラメーターを説明します。
パラメーター | 型 | 必須 | 説明 |
server_name | 文字列 | はい | OSS サーバーの名前。 説明 このパラメーターはグローバルであり、一意である必要があります。名前は大文字と小文字を区別せず、最大長は 64 文字です。64 文字を超える名前は自動的に切り捨てられます。OSS サーバー名を引用符で囲んだ文字列として指定できます。 |
my_database_name | 文字列 | いいえ | CSV データファイルを含む OSS 内のディレクトリ。 説明
|
my_oss_endpoint | 文字列 | はい | 対応する OSS リージョンのエンドポイント。 説明 Alibaba Cloud ホストからデータベースにアクセスする場合は、名前に「internal」が含まれる内部エンドポイントを使用して、パブリックネットワークトラフィックを回避します。 たとえば、中国 (杭州) リージョンの内部エンドポイントは |
my_oss_bucket | 文字列 | はい | データファイルが保存されている OSS バケット。このバケットは事前に OSS で作成しておく必要があります。 説明 最高のパフォーマンスを得るには、OSS バケットと PolarDB データベースクラスターを同じアベイラビリティゾーンに配置して、ネットワーク遅延を削減します。 |
my_oss_access_key_id | 文字列 | はい | RAM ユーザーまたは Alibaba Cloud アカウントの AccessKey ID。 |
my_oss_access_key_secret | 文字列 | はい | RAM ユーザーまたは Alibaba Cloud アカウントの AccessKey Secret。 |
my_oss_prefix | 文字列 | いいえ | CSV データファイルを含む OSS 内のディレクトリ。 |
my_oss_sts_token | 文字列 | いいえ | STS 一時アクセス認証情報。 説明
|
古いバージョン
ご利用のデータベースクラスターが次のいずれかの条件を満たす場合は、次の構文を使用します:
カーネルバージョンが MySQL 8.0.1 で、リビジョンが 8.0.1.1.25.4 から 8.0.1.1.27 の間。
カーネルバージョンが MySQL 8.0.2 で、リビジョンが 8.0.2.2.1 から 8.0.2.2.4 の間。
CREATE SERVER <server_name>
FOREIGN DATA WRAPPER oss OPTIONS
(
[DATABASE '<my_database_name>',]
EXTRA_SERVER_INFO '{"oss_endpoint": "<my_oss_endpoint>","oss_bucket": "<my_oss_bucket>","oss_access_key_id":"<my_oss_access_key_id>","oss_access_key_secret":"<my_oss_access_key_secret>"}'
); このバージョンでは、構文は oss_prefix および oss_sts_token パラメーターをサポートしていません。
次の表にパラメーターを説明します。
パラメーター | 型 | 必須 | 説明 |
server_name | 文字列 | はい | OSS サーバーの名前。 説明 このパラメーターはグローバルであり、一意である必要があります。名前は大文字と小文字を区別せず、最大長は 64 文字です。64 文字を超える名前は自動的に切り捨てられます。OSS サーバー名を引用符で囲んだ文字列として指定できます。 |
my_database_name | 文字列 | いいえ | CSV データファイルを含む OSS 内のディレクトリの名前。 |
my_oss_endpoint | 文字列 | はい | 対応する OSS リージョンのエンドポイント。 説明 Alibaba Cloud ホストからデータベースにアクセスする場合は、名前に「internal」が含まれる内部エンドポイントを使用して、パブリックネットワークトラフィックを回避します。 例: |
my_oss_bucket | 文字列 | はい | データファイルが保存されている OSS バケット。バケットは事前に OSS で作成しておく必要があります。 |
my_oss_access_key_id | 文字列 | はい | RAM ユーザーまたは Alibaba Cloud アカウントの AccessKey ID。 |
my_oss_access_key_secret | 文字列 | はい | RAM ユーザーまたは Alibaba Cloud アカウントの AccessKey Secret。 |
OSS サーバーを作成するには SERVERS_ADMIN 権限が必要です。SHOW GRANTS FOR <username>; コマンドを実行して、現在のユーザーが SERVERS_ADMIN 権限を持っているかどうかを確認できます。現在、高権限アカウントはこの権限をデフォルトで持っており、低権限アカウントに付与できます。
SERVERS_ADMIN権限がない場合、次のエラーが返されます:Access denied; you need (at least one of) the SERVERS_ADMIN OR SUPER privilege(s) for this operation。SERVERS_ADMIN権限を持たない標準アカウントを使用している場合、高権限アカウントはGRANT SERVERS_ADMIN ON *.* TO `users`@`%` WITH GRANT OPTIONを実行して権限を付与できます。高権限アカウントを持っていても
SERVERS_ADMIN権限がない場合は、PolarDB コンソールの ページに移動して権限をリセットします。しばらく待ってから高権限アカウントを再度確認すると、アカウントにSERVERS_ADMIN権限が付与されます。これらの手順を試しても高権限アカウントにSERVERS_ADMIN権限がない場合は、チケットを送信してお問い合わせいただくか、DingTalk でグループ番号を検索してお問い合わせください。高権限アカウントは
SELECT Server_name, Extra_server_info FROM mysql.servers;を実行して OSS サーバー情報を表示できます。セキュリティのため、oss_access_key_idとoss_access_key_secretのパラメーター値は暗号化されており、表示できません。
データのアップロード
ossutil コマンドラインツールを使用して、ローカルの CSV ファイルを Object Storage Service (OSS) にアップロードできます。
CSV ファイルをアップロードする OSS ディレクトリは、OSS サーバーの
DATABASEまたはoss_prefixパラメーターで指定されたディレクトリと一致する必要があります。アップロードする CSV ファイルの名前は
<foreign_table_name>.CSVの形式で、.CSV拡張子は 大文字である必要があります。たとえば、OSS 外部テーブルの名前がt1の場合、CSV ファイルの名前はt1.CSVである必要があります。CSV ファイルのデータフィールドは、OSS 外部テーブルの列と一致する必要があります。たとえば、OSS 外部テーブル
t1にINT型の単一列idがある場合、アップロードする CSV ファイルにもINTフィールドが 1 つだけ含まれている必要があります。ローカルの MySQL データベースからデータファイルを直接アップロードし、テーブル定義に基づいて対応する OSS 外部テーブルを作成することを推奨します。
OSS 外部テーブルの作成
OSS サーバーを定義した後、PolarDB に OSS 外部テーブルを作成して、OSS 内の CSV ファイルにマッピングします。例:
CREATE TABLE <table_name> (create_definition,...) engine=csv connection="<connection_string>";connection_string は、スラッシュ (/) で結合された次の部分で構成されます:
OSS サーバー名。
(オプション) OSS 内のデータファイルへのパス。
説明データファイルパスは、次のいずれかの条件を満たす場合にのみサポートされます。
カーネルバージョンが MySQL 8.0.1 で、リビジョンが 8.0.1.1.28 以降。
カーネルバージョンが MySQL 8.0.2 で、リビジョンが 8.0.2.2.5 以降。
(オプション) データファイルの名前。
説明データファイル名に
.CSVサフィックスを含めないでください。データファイル名を指定しない場合、現在のテーブルに対応する OSS ファイルは
<current_table_name>.CSVです。データファイル名を指定した場合、対応する OSS ファイルは<specified_data_file_name>.CSVです。OSS 内のデータファイルへのパスを指定する場合は、データファイル名も指定する必要があります。そうしないと、システムはパスの最後のセグメントをファイル名として扱います。
OSS 外部テーブルの表示
OSS 外部テーブルが作成された後、SHOW CREATE TABLE <table_name>; を実行してその定義を表示できます。テーブルのエンジンが CSV であること (つまり ENGINE=CSV) を確認します。そうでない場合、ご利用の PolarDB データベースクラスターのバージョンが古すぎて OSS エンジンをサポートしていない可能性があります。詳細については、「前提条件」をご参照ください。
例
CREATE TABLE t1 (id int) engine=csv connection="server_name/a/b/c/d/t1";この例は connection_string の構成を示しています:
OSS サーバー名:
server_name。OSS 内のデータファイルへのパス:
oss_prefix/a/b/c/d/。データファイル:
t1。実際のファイルはt1.CSVですが、要件に従って.CSVサフィックスは省略されています。
OSS 外部テーブルのデータファイルは名前でのみ指定できます。たとえば、次の文では、PolarDB は OSS の oss_prefix パスで t2.CSV ファイルを検索します。
CREATE TABLE t1 (id int) engine=csv connection="server_name/t2";データのクエリ
次の例では、前のステップで作成した t1 テーブルをクエリします。
-- t1 テーブルの行数をカウントします。
SELECT count(*) FROM t1;
-- 範囲クエリ。
SELECT id FROM t1 WHERE id < 10 AND id > 1;
-- ポイントクエリ。
SELECT id FROM t1 where id = 3;
-- 複数テーブルの結合。
SELECT id FROM t1 left join t2 on t1.id = t2.id WHERE t2.name like "%er%";次の表は、データクエリ中に発生する可能性のある一般的なエラーとその解決策を示しています。
クエリがエラーではなく警告を返す場合は、SHOW WARNINGS; を実行して警告の詳細を表示します。
エラーメッセージ | 原因 | 解決策 |
OSS error: No corresponding data file on the OSS engine. | OSS で対応するデータファイルが見つかりませんでした。 | データファイルが OSS の期待されるパスに存在するかどうかを確認します。
|
There is not enough memory space for OSS transmission. Currently requested memory %d. | OSS クエリのためのメモリが不足しています。 | このエラーを解決するには:
|
ERROR 8054 (HY000): OSS error: error message : Couldn't connect to server.Failed connect to aliyun-mysql-oss.oss-cn-hangzhou-internal.aliyuncs.com:80; | データベースクラスターが OSS サーバーに接続できません。 | データベースインスタンスと OSS バケットが同じアベイラビリティゾーンにあるかどうかを確認します。
|
クエリの最適化
OSS エンジンは、適格な条件をリモートの OSS エンジンにプッシュダウンすることで、クエリのパフォーマンスを向上させます。この最適化は エンジン条件プッシュダウンと呼ばれます。条件プッシュダウンには次の制限が適用されます:
UTF-8 でエンコードされた CSV テキストファイルのみがサポートされます。
SQL 文では、次の種類の演算子と算術式のみがサポートされます:
比較演算子:
>、<、>=、<=、==論理演算子:
LIKE、IN、AND、OR算術式:
+、-、*、/
単一ファイルのクエリのみがサポートされます。`JOIN`、`ORDER BY`、`GROUP BY`、または `HAVING` 句を使用するクエリはサポートされていません。
WHERE 句に集約操作を含めることはできません。たとえば、
where max(age) > 100は許可されません。最大列数は 1,000 で、SQL 文の列名の最大長は 1,024 バイトです。
LIKE 句では、最大 5 つの
%ワイルドカードがサポートされます。IN 句では、最大 1,024 の定数がサポートされます。
CSV ファイルの場合、行ごとの最大サイズは 256 KB、列ごとの最大サイズは 256 KB です。
SQL 文の最大長は 16 KB です。WHERE 句には最大 20 の式を含めることができ、クエリには最大 100 の集約操作を含めることができます。
この機能はデフォルトで無効になっています。有効にするには、 SET SESSION optimizer_switch='engine_condition_pushdown=on'; コマンドを実行します。
これらの条件を満たすクエリは OSS エンジンにプッシュダウンされます。OSS 外部テーブルの実行計画を確認して、どの条件がプッシュダウンされるかを確認します。
EXPLAINを使用して OSS 外部テーブルの実行計画を表示します。例:EXPLAIN SELECT count(*) FROM `t1` WHERE `id` > 5 AND `id` < 100 AND `name` LIKE "%1%%%%%" GROUP BY `id` ORDER BY `id` DESC; +----+-------------+-------+------------+------+---------------+------+---------+------+-------+----------+----------------------------------------------------------------------------------------------------------------------------------+ | id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra | +----+-------------+-------+------------+------+---------------+------+---------+------+-------+----------+----------------------------------------------------------------------------------------------------------------------------------+ | 1 | SIMPLE | t1 | NULL | ALL | NULL | NULL | NULL | NULL | 15000 | 1.23 | Using where; With pushed engine condition ((`test`.`t1`.`id` > 5) and (`test`.`t1`.`id` < 100)); Using temporary; Using filesort | +----+-------------+-------+------------+------+---------------+------+---------+------+-------+----------+----------------------------------------------------------------------------------------------------------------------------------+ 1 row in set, 1 warning (0.00 sec)With pushed engine conditionに続く条件は、リモートの OSS エンジンにプッシュダウンされます。残りの条件、`name` LIKE "%1%%%%%"およびGROUP BY `id` ORDER BY `id` DESCはプッシュダウンされず、ローカルの OSS サーバーでのみ実行されます。tree形式を使用して OSS 外部テーブルの実行計画を表示します。例:EXPLAIN FORMAT=tree SELECT SELECT count(*) FROM `t1` WHERE `id` > 5 AND `id` < 100 AND `name` LIKE "%1%%%%%" GROUP BY `id` ORDER BY `id` DESC; +-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | EXPLAIN | +-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | -> Sort: <temporary>.id DESC -> Table scan on <temporary> -> Aggregate using temporary table -> Filter: (t1.`name` like '%1%%%%%') (cost=1690.00 rows=185) -> Table scan on t1, extra ( engine conditions: ((t1.id > 5) and (t1.id < 100)) ) (cost=1690.00 rows=15000) | +-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ 1 row in set (0.00 sec)engine conditions:に続く条件は、リモートの OSS エンジンにプッシュダウンされます。残りの条件、`name` LIKE "%1%%%%%"およびGROUP BY `id` ORDER BY `id` DESCはプッシュダウンされず、ローカルの OSS サーバーでのみ実行されます。説明ご利用のクラスターは PolarDB for MySQL 8.0.2 以降を実行している必要があります。「バージョン番号のクエリ」の指示に従ってクラスターのバージョンを確認できます。
JSON形式を使用して OSS 外部テーブルの実行計画を表示します。例:EXPLAIN FORMAT=json SELECT count(*) FROM `t1` WHERE `id` > 5 AND `id` < 100 AND `name` LIKE "%1%%%%%" GROUP BY `id` ORDER BY `id` DESC; +-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | EXPLAIN | +-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | { "query_block": { "select_id": 1, "cost_info": { "query_cost": "1875.13" }, "ordering_operation": { "using_filesort": false, "grouping_operation": { "using_temporary_table": true, "using_filesort": true, "cost_info": { "sort_cost": "185.13" }, "table": { "table_name": "t1", "access_type": "ALL", "rows_examined_per_scan": 15000, "rows_produced_per_join": 185, "filtered": "1.23", "engine_condition": "((`test`.`t1`.`id` > 5) and (`test`.`t1`.`id` < 100))", "cost_info": { "read_cost": "1671.49", "eval_cost": "18.51", "prefix_cost": "1690.00", "data_read_per_join": "146K" }, "used_columns": [ "id", "name" ], "attached_condition": "(`test`.`t1`.`name` like '%1%%%%%')" } } } } } | +-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ 1 row in set, 1 warning (0.00 sec)同様に、
engine_conditionフィールドの条件はリモートの OSS エンジンにプッシュダウンされます。残りの条件、`name` LIKE "%1%%%%%"およびGROUP BY `id` ORDER BY `id` DESCはプッシュダウンされず、ローカルの OSS サーバーでのみ実行されます。
次のエラーが表示された場合、OSS データファイル内の一部の文字がエンジン条件プッシュダウンと互換性がないことを示しています。
OSS error: The current query does not support engine condition pushdown. You need to use NO_ECP() hint or set optimizer_switch = 'engine_condition_pushdown=OFF' to turn off the condition push down function.hint または optimizer_switch を使用して、エンジン条件プッシュダウンを手動で無効にすることができます。
ヒント
ヒントを使用して、特定のクエリのエンジン条件プッシュダウンを無効にします。たとえば、
t1テーブルのエンジン条件プッシュダウンを無効にするには:SELECT /*+ NO_ECP(t1) */ `j` FROM `t1` WHERE `j` LIKE "%c%" LIMIT 10;optimizer_switch
optimizer_switchを使用して、現在のセッションのすべてのクエリでエンジン条件プッシュダウンを無効にします。SET SESSION optimizer_switch='engine_condition_pushdown=off'; # 現在のセッションのエンジン条件プッシュダウンを無効にします。現在のセッションのエンジン条件プッシュダウンの状態を確認するには、次のコマンドを実行します:
select @@optimizer_switch;
OSS サーバー情報の同期
PolarDB クラスター内のプライマリノードと読み取り専用ノードは、単一の OSS サーバーを共有し、すべてのノードからのデータアクセスを可能にします。このロックフリー同期により、各ノードでの操作が独立して行われることが保証されます。
OSS サーバー情報を変更すると、変更はロックなしで読み取り専用ノードに同期されます。読み取り専用ノードのスレッドが OSS サーバーのロックを保持している場合、この同期が遅延することがあります。この場合、/*force_node='pi-bpxxxxxxxx'*/ flush privileges; または /*force_node='pi-bpxxxxxxxx'*/flush table oss_foreign_table; を実行して、読み取り専用ノードの OSS サーバー情報を手動で更新します。