PolarDBを使用すると、Object Storage Service (OSS) 外部テーブルを使用して、OSSに保存されているCSV形式のデータを直接クエリできます。 これにより、ストレージコストが効果的に削減されます。 このトピックでは、OSS外部テーブルを使用してOSSデータにアクセスする方法について説明します。
前提条件
PolarDBクラスターは、次のいずれかの要件を満たしています。
PolarDB for MySQL 8.0.1クラスターを使用する場合、クラスターのリビジョンバージョンは8.0.1.1.25.4以降である必要があります。
PolarDB for MySQL 8.0.2クラスターを使用する場合、クラスターのリビジョンバージョンは8.0.2.2.1以降である必要があります。
クラスターバージョンの確認方法の詳細については、「エンジンバージョン」トピックの「エンジンバージョンの照会」セクションをご参照ください。
制御ポリシー機能の動作
OSS外部テーブルを使用して、クエリと分析のためにCSV形式のコールドデータをOSSバケットに保存できます。 コールドデータとは、アクセス頻度の低いデータを指します。 次の図は、プロセスを示しています。
CSV形式のデータには、数値、日付と時刻、文字列の値、およびNULL値を含めることができます。 次の表に、サポートされるデータ型を示します。
地理空間データ型はサポートされていません。
CSV形式の圧縮ファイルを照会することはできません。
NULL値は、リビジョンバージョンが8.0.1.1.28以降のPolarDB for MySQL 8.0.1クラスター、またはリビジョンバージョンが8.0.2.2.5以降のPolarDB for MySQL 8.0.2クラスターでサポートされています。
数値型
データ型
サイズ
データ範囲 (署名済み)
データ範囲 (符号なし)
説明
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 ~ 9223372036854775807
0 ~ 18446744073709551615
大きな整数値
FLOAT
4 バイト
-3.402823466 E + 38 ~-1.175494351E-38; 0; 1.175494351E-38 ~ 3.402823466351E + 38
0; 1.175494351E-38 ~ 3.402823466E + 38
単精度浮動小数点値
DOUBLE
8 バイト
-2.2250738585072014E-308 ~-1.7976931348623157E + 308; 0; 1.7976931348623157E + 308 ~ 2.2250738585072014E-308
0; 1.7976931348623157E + 308〜2.2250738585072014E-308
倍精度浮動小数点値
DECIMAL
DECIMAL(M,D) の場合、M>DであればM + 2である。 そうでなければ、それはD + 2である。
MとDの値に依存します。
MとDの値に依存します。
10進値
日付と時刻のタイプ
データ型
サイズ
データ範囲
Format
説明
日付
3バイト
1000-01-01 ~ 9999-12-31
YYYY-MM-DD
日付値
時間
3バイト
-838:59:59 ~ 838:59:59
HH:MM:SS
時間値または期間
YEAR
1バイト
1901 ~ 2155
YYYY
年の価値
日付時刻
8 バイト
1000-01-01 00:00:00 ~ 9999-12-31 23:59:59
YYYY-MM-DD HH:MM:SS
日付と時刻の組み合わせ値
説明このタイプの月と日付は2桁でなければなりません。 たとえば、1月1日、2020は2020-1-1ではなく2020-01-01として記述する必要があります。 2020-1-1がOSSにプッシュされた場合、クエリは期待どおりに実行できません。
TIMESTAMP
4 バイト
1970-01-01 00:00:00 ~ 2038-01-19 03:14:07
YYYY-MM-DD HH:MM:SS
タイムスタンプ (日付と時刻の組み合わせ) 値
説明このタイプの月と日付は2桁でなければなりません。 たとえば、1月1日、2020は2020-1-1ではなく2020-01-01として記述する必要があります。 2020-1-1がOSSにプッシュされた場合、クエリは期待どおりに実行できません。
文字列型
データ型
サイズ
説明
CHAR
0 ~ 255バイト
固定長の文字列
VARCHAR
0 ~ 65535バイト
可変長文字列A variable-length string
TINYBLOB
0 ~ 255バイト
255文字までの小さなバイナリの大きなオブジェクト
TINYTEXT
0 ~ 255バイト
短い文字列
BLOB
0 ~ 65535バイト
標準バイナリラージオブジェクト
TEXT
0 ~ 65535バイト
標準文字列
MEDIUMBLOB
0 ~ 16777215バイト
中バイナリラージオブジェクト
MEDIUMTEXT
0 ~ 16777215バイト
ミディアム文字列
LONGBLOB
0 ~ 4294967295バイト
長いバイナリの大きなオブジェクト
LONGTEXT
0 ~ 4294967295バイト
長い文字列
NULL値
NULL値を挿入します。
OSS外部テーブルにNULL値を挿入します。
OSS外部テーブルにNULL値を挿入するには、OSS外部テーブルの作成時に
NULL_MARKER
を指定する必要があります。 OSS外部テーブルのNULL_MARKER
のデフォルト値はNULLです。show create table
ステートメントを実行して、NULL_MARKERの値を確認できます。show create table t1;
結果:
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
の値を二重引用符 (") で囲まずに挿入した場合、PolarDBはその値をNULLとして識別します。説明NULL_MARKER
の値を二重引用符 (") で囲むと、PolarDBはその値を文字列として識別します。 つまり、is_null
ステートメントは値をnullとして識別できません。 CSVファイルでNULL値が割り当てられているフィールドのデータ型が、OSS外部テーブルの対応するフィールドのデータ型と一致しない場合、エラーが報告されます。の値は、数字のみで構成することも、空のままにすることもできません。 さらに、次の文字を含めることはできません。
"
、\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",NULL
OSS外部テーブルをクエリすると、次のOSSデータが取得されます。
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 | +------+----------+---------------------+ 4 rows in set (0.00 sec)
NULL値を読み取ります。
CSVファイルからデータを読み取るときに、CSVファイルのフィールドの値がNULLで、OSS外部テーブルの対応する値をNULLに設定できる場合、フィールドは直接NULLに設定されます。
CSVファイルからデータを読み取るときに、CSVファイルのフィールドの値がNULLであるが、OSS外部テーブルの対応する値がNOT NULLに設定されている場合、CSVファイルのデータはOSS外部テーブルで指定されたデータと競合します。 この場合、指定された構文検証ルールに応じて異なる結果が返されます。
sql_mode
パラメーターをSTRICT_TRANS_TABLES
に設定すると、エラーが報告されます。sql_mode
パラメーターをSTRICT_TRANS_TABLES
以外の値に設定し、フィールドにデフォルト値がある場合、フィールドのデフォルト値が使用されます。 フィールドにデフォルト値がない場合、フィールドタイプに基づいてMySQLデフォルト値がフィールドに割り当てられます。 詳細については、「データ型のデフォルト値」をご参照ください。 警告メッセージが表示された場合は、show warnings;
ステートメントを実行して、警告メッセージの詳細を表示できます。
説明show variables like "sql_mode";
ステートメントを実行して、現在の構文検証ルールを表示できます。 PolarDBコンソールの [パラメーター] ページでsql_mode
パラメーターの値を変更して、構文検証ルールを変更することもできます。 詳細については、「クラスターとノードパラメーターの設定」をご参照ください。例:
t
という名前のOSS外部テーブルを作成し、id
フィールドをNOT NULLに設定します。 フィールドにデフォルト値を指定しないでください。CREATE TABLE `t` ( `id` int(11) NOT NULL ) ENGINE=CSV CONNECTION="server_name";
この例では、
t.CSV
ファイルに次のデータが含まれています。NULL 2
OSS外部テーブルを使用してCSVファイルからデータを読み取ると、次のいずれかのシナリオが発生します。
sql_mode
パラメーターをSTRICT_TRANS_TABLES
に設定し、次のステートメントを実行してCSVファイル内のデータを照会した場合:select * from t;
次のエラーメッセージが報告されます。
ERROR 1364 (HY000): Field 'id' doesn't have a default value
sql_mode
パラメーターをSTRICT_TRANS_TABLES
以外の値に設定し、次のステートメントを実行してCSVファイル内のデータを照会した場合:select * from t;
次の応答が返されます。
+----+ | id | +----+ | 0 | | 2 | +----+ 2 rows in set, 1 warning (0.00 sec)
0はMySQLのデフォルト値です。
警告メッセージの詳細を表示するには、次のステートメントを実行します。
show warnings;
結果:
+---------+------+-----------------------------------------+ | Level | Code | Message | +---------+------+-----------------------------------------+ | Warning | 1364 | Field 'id' doesn't have a default value | +---------+------+-----------------------------------------+ 1 row in set (0.00 sec)
制限事項
OSS外部テーブルを使用して、CSV形式のデータのみをクエリできます。
OSS外部テーブルに対して実行できるのは、CREATE、SELECT、およびDROPの操作のみです。
説明DROP操作は、OSSに保存されているデータファイルに影響を与えずに、PolarDBのテーブル情報のみを削除します。
OSS外部テーブルは、インデックス作成、パーティション分割、またはトランザクションをサポートしていません。
パラメーター
コンソールの [パラメーター] ページで、次のパラメーターを表示または変更できます。
パラメーター | カテゴリ | 説明 |
loose_csv_oss_buff_size | Sessionパラメータ | OSSスレッドが占有するメモリのサイズ。 デフォルト値: 134217728 単位:バイト 有効な値: 4096〜134217728。 |
loose_csv_max_oss_threads | グローバルパラメーター | 実行が許可されているOSSスレッドの数。 デフォルト値は 1 です。 設定可能な値は 1~100 です。 |
次の式を使用して、OSSの合計メモリ使用量を計算できます。OSSの合計メモリ使用量=loose_csv_max_oss_threadsパラメーターの値 × loose_csv_oss_buff_sizeパラメーターの値
。
OSSを使用する場合は、OSSの総メモリ使用量を現在のノードのメモリ容量の5% に制限することを推奨します。 そうしないと、メモリ不足の問題が発生する可能性があります。
手順
CSVファイルをOSSにアップロードします。
ossutilツールを使用して、ローカルCSVファイルをリモートOSSバケットにアップロードできます。
説明CSVファイルがアップロードされるOSSディレクトリは、ossサーバーの
my_database_name
またはOSS_prefix
パラメーターで指定されたディレクトリと同じである必要があります。アップロードされるCSVファイルの名前は、
Foreign table name.CSV
形式である必要があります。CSV拡張子は大文字である必要があります。 たとえば、作成されたOSS外部テーブルの名前がt1
の場合、アップロードされるCSVファイルの名前はt1.CSV
でなければなりません。CSVファイルのデータフィールドは、OSS外部テーブルのフィールドと一致する必要があります。 たとえば、作成されたOSS外部テーブル
t1
に1つのフィールドid
しか含まれておらず、そのフィールドがINT
タイプの場合、アップロードされたCSVファイルにはINT
タイプのフィールドが1つだけ含まれている必要があります。ローカルMySQLデータファイルを直接アップロードし、テーブル定義に基づいてOSS外部テーブルを作成することを推奨します。
OSS接続情報を追加します。
OSSサーバーを作成することで、OSS接続情報を追加できます。
説明OSSに接続する他の方法は、セキュリティリスクのために無効になっています。 OSSサーバーを作成してOSS接続情報を追加し、OSSに接続することのみができます。
リビジョンバージョンが8.0.1.1.28以降のPolarDB for MySQL 8.0.1クラスター、またはリビジョンバージョンが8.0.2.2.5以降のPolarDB for MySQL 8.0.2クラスターを使用する場合、次の構文を使用してOSSサーバーを作成できます。
CREATE SERVER <server_name> FOREIGN DATA WRAPPER oss OPTIONS ( 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>"}' );
説明リビジョンバージョンが8.0.1.1.29以降のPolarDB for MySQL 8.0.1クラスター、またはリビジョンバージョンが8.0.2.2.6以降のPolarDB for MySQL 8.0.2クラスターでは、
my_oss_sts_token
パラメーターを使用できます。my_database_name
パラメーターは構文でサポートされています。 作成したOSSサーバーにmy_database_name
パラメーターとmy_oss_prefix
パラメーターの両方が存在する場合、ファイルの最終パスはmy_oss_prefix/my_database_name
です。my_database_name
パラメーターの指定方法の詳細については、次のテキストをご参照ください。
次の表に、構文のパラメーターを示します。
パラメーター
データ型
必須
説明
server_name
String
課金されます
OSSサーバー名。
説明名前はグローバルに一意である必要があります。 名前の長さは最大64文字で、大文字と小文字は区別されません。 64文字を超える名前は自動的に切り捨てられます。 OSSサーバー名を引用符で囲まれた文字列として指定できます。
my_oss_endpoint
String
課金されます
OSSサーバーのエンドポイント。
説明Alibaba Cloudサーバーからデータベースにアクセスする場合は、内部エンドポイントを使用してインターネットトラフィックの発生を防ぎます。 内部エンドポイントにはキーワード "internal" が含まれています。
たとえば、中国 (杭州) リージョンのOSSノードの内部エンドポイントは
oss-cn-xxx-internal.aliyuncs.com
です。my_oss_bucket
String
課金されます
データファイルが保存されているバケット。 データをインポートする前に、OSSでバケットを作成する必要があります。
説明ネットワークの遅延を減らすために、PolarDBクラスターと同じゾーンにバケットをデプロイすることを推奨します。
my_oss_access_key_id
String
課金されます
Resource Access Management (RAM) ユーザーまたはAlibaba CloudアカウントのAccessKey ID。
AccessKeyペアの作成方法の詳細については、「AccessKeyペアの作成」をご参照ください。
my_oss_access_key_secret
String
課金されます
RAMユーザーまたはAlibaba CloudアカウントのAccessKeyシークレット。
AccessKeyペアの作成方法の詳細については、「AccessKeyペアの作成」をご参照ください。
my_oss_prefix
String
課金されません
CSVファイルのOSSディレクトリ。
my_oss_sts_token
String
課金されません
Security Token Service (STS) によって提供される一時的なアクセス資格情報
説明このパラメーターは、STSが提供する一時的なアクセス資格情報を使用してOSSにアクセスする場合に必要です。
my_oss_sts_token
パラメーターの値には、デフォルトの有効期限があります。my_oss_sts_token
パラメーターの値が期限切れの場合、次のステートメントを実行して、EXTRA_SERVER_INFO
内のすべてのパラメーターをリセットします。ALTER SERVER server_name OPTIONS(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>"}');
説明OSSサーバーを作成するときは、SERVERS_ADMIN権限が必要です。
SHOW GRANTS FOR the current user
ステートメントを実行して、現在のユーザーにSERVERS_ADMIN権限があるかどうかを確認できます。 特権アカウントにはデフォルトでSERVERS_ADMIN権限があり、標準アカウントにSERVERS_ADMIN権限を付与できます。SERVERS_ADMIN権限を持っていない場合、エラーメッセージ
アクセスが拒否されました。この操作にはSERVERS_ADMINまたはSUPER権限が必要です (少なくとも1つ)
が表示されます。SERVERS_ADMIN権限を持たない標準アカウントを使用する場合、特権アカウントを使用して次のステートメントを実行できます。
GRANT SERVERS_ADMIN ON * * to 'users @ '%' WITH GRANT OPTION
SERVERS_ADMIN権限を持たない特権アカウントを使用する場合、アカウントの権限をリセットできます。 これを行うには、コンソールでクラスターを見つけ、クラスターIDまたは名前をクリックしてクラスターの詳細ページに移動します。 左側のナビゲーションウィンドウで、[設定と管理]> [アカウント] を選択します。 [ユーザーアカウント] タブで、管理する特権アカウントを見つけ、[操作] 列の [権限のリセット] をクリックします。 権限がリセットされるまで待ちます。 特権アカウントにはSERVERS_ADMIN権限があります。特権アカウントを使用する場合は、
SELECT Server_name, Extra_server_info FROM mysql.servers;
ステートメントを実行して、作成したOSSサーバーに関する情報を表示できます。oss_access_key_id
およびoss_access_key_secret
パラメーターの値は、セキュリティ上の理由から暗号化されています。
リビジョンバージョンが8.0.1.1.25.4から8.0.1.1.28までのPolarDB for MySQL 8.0.1クラスター、またはリビジョンバージョンが8.0.2.2.1から8.0.2.2.5までのPolarDB for MySQL 8.0.2クラスターを使用する場合、次の構文を使用してOSSサーバーを作成できます。
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
パラメーターは、構文ではサポートされていません。次の表に、構文のパラメーターを示します。
パラメーター
データ型
必須
説明
server_name
String
課金されます
OSSサーバー名。
説明名前はグローバルに一意である必要があります。 名前の長さは最大64文字で、大文字と小文字は区別されません。 64文字を超える名前は自動的に切り捨てられます。 OSSサーバー名を引用符で囲まれた文字列として指定できます。
my_database_name
String
課金されません
CSVファイルのOSSディレクトリの名前。
my_oss_endpoint
String
課金されます
OSSサーバーのエンドポイント。
説明Alibaba Cloudサーバーからデータベースにアクセスする場合は、内部エンドポイントを使用してインターネットトラフィックの発生を防ぎます。 内部エンドポイントにはキーワード "internal" が含まれています。
例:
oss-cn-xxx-internal.aliyuncs.com
。my_oss_bucket
String
課金されます
データファイルが保存されているバケット。 データをインポートする前に、OSSでバケットを作成する必要があります。
my_oss_access_key_id
String
課金されます
RAMユーザーまたはAlibaba CloudアカウントのAccessKey ID。
AccessKeyペアの作成方法の詳細については、「AccessKeyペアの作成」をご参照ください。
my_oss_access_key_secret
String
課金されます
RAMユーザーまたはAlibaba CloudアカウントのAccessKeyシークレット。
AccessKeyペアの作成方法の詳細については、「AccessKeyペアの作成」をご参照ください。
OSS外部テーブルを作成します。
OSSサーバーを定義した後、PolarDBにOSS外部テーブルを作成してOSSに接続できます。 例:
create table t1 (id int) engine=csv connection="connection_string";
connection_string
の値は、スラッシュ (/) で区切られた次の項目で構成されます。OSSサーバー名。
オプションです。 OSS内のデータファイルのパス。
説明リビジョンバージョンが8.0.1.1.28以降のPolarDB for MySQL 8.0.1クラスター、またはリビジョンバージョンが8.0.2.2.5以降のPolarDB for MySQL 8.0.2クラスターを使用する場合、OSSでデータファイルのパスを設定できます。
オプションです。 データファイル名。
説明データファイル名には、
. CSV
拡張子を使用します。
例:
create table t1 (id int) engine=csv connection="server_name/a/b/c/d/t1";
この例では、OSSのデータファイルのパスは
oss_prefix/a/b/c/d/
で、データファイルの名前はt1.CSV
です。説明OSS外部テーブルに対応するデータファイルを指定するには、データファイル名のみを使用できます。 たとえば、
create table t1 (id int) engine=csv connection="server_name/t2"
ステートメントを実行すると、PolarDBはossのoss_prefixパラメーターで指定されたディレクトリでt2.CSV
ファイルを検索します。OSSのデータファイルのパスを
connection_string
に追加する場合は、データファイルの名前を追加する必要があります。 それ以外の場合、PolarDBがデータファイルを検索するときに、パスの最後のセグメントがファイル名と見なされます。データファイル名を指定しない場合、現在のテーブルに対応するOSSファイルは
[現在のテーブルの名前]
になります。 データファイル名を指定した場合、現在のテーブルに対応するOSSファイルは指定されたデータファイル名. CSV
となります。
OSS外部テーブルの作成後、
show create table
ステートメントを実行してテーブルを表示できます。 作成したテーブルのエンジンがCSVかどうかを確認します。 そうでない場合、現在のPolarDBクラスターのバージョンが古いため、OSSをサポートしていません。データの照会
この例では、前の手順で説明した
t1
テーブルを使用して、データのクエリ方法を示します。# Query the number of data records in the t1 table. SELECT count(*) FROM t1; # Query data records in the specified range. SELECT id FROM t1 WHERE id < 10 AND id > 1; # Query a specific record. SELECT id FROM t1 where id = 3; # Query records by joining multiple tables. SELECT id FROM t1 left join t2 on t1.id = t2.id WHERE t2.name like "%er%";
次の表に、データを照会するときの一般的なエラーメッセージと原因を示します。
説明エラーメッセージが報告されていないが、データのクエリ時に警告メッセージが表示された場合は、
SHOW WARNINGS;
ステートメントを実行してメッセージを表示する必要があります。エラーメッセージ
原因
解決策
OSSエラー: OSSエンジンに対応するデータファイルがありません。
指定されたデータファイルがOSSに見つかりません。
上記の規則に基づいて、OSSの指定されたパスにデータファイルが存在するかどうかを確認します。
該当する場合は、データファイルが次の命名規則に準拠しているかどうかを確認します。データファイル名は
外部テーブル名. CSV
形式です。CSV拡張子は大文字です。そうでない場合は、指定したパスにデータファイルをアップロードする必要があります。
OSS送信に十分なメモリ容量がありません。 現在要求されているメモリ % d。
OSSクエリのメモリ不足。
次のいずれかの方法を使用して、このエラーを修正できます。
コンソールの [パラメーター] ページで、
loose_csv_max_oss_threads
パラメーターの値を変更して、より多くのOSSスレッドを実行します。flush tableステートメントを実行して、一部のOSSテーブルのスレッドを閉じます。
エラー8054 (HY000): OSSエラー: エラーメッセージ: サーバーに接続できませんでした。o aliyun-mysql-oss.oss-cn-hangzhou-internal.aliyuncs.com:80の接続に失敗しました。
現在のクラスターはOSSサーバーに接続できません。
現在のクラスターがOSSバケットと同じゾーンにあるかどうかを確認します。
そうでない場合は、現在のクラスターとOSSバケットを同じゾーンに移動する必要があります。
そうである場合、クラスターのエンドポイントをパブリックエンドポイントに変更できます。 エンドポイントの変更後もエラーが続く場合は、Alibaba Cloudテクニカルサポートにお問い合わせください。
クエリの最適化
クエリプロセス中、クエリエンジンは特定の条件のクエリをリモートOSSバケットにプッシュダウンして、クエリ効率を向上させることができます。 この最適化は、エンジン状態プッシュダウン
と呼ばれる。 エンジン状態のプッシュダウン機能には、次の制限があります。
UTF-8エンコードされたCSVファイルのみがサポートされます。
SQL文では、次の種類の演算子のみがサポートされます。
比較演算子:
>
、<
、>=
、<=
、および==
論理演算子:
LIKE
、IN
、AND
、およびOR
算術演算子:
+
、-
、*
、および/
SQL文を使用する場合、照会できるファイルは1つだけです。 JOIN、ORDER BY、GROUP BY、およびHAVINGはサポートされていません。
WHERE句に集計条件を含めることはできません。 たとえば、
WHERE max(age) > 100
は許可されません。SQL文には最大1,000個の列を指定できます。 SQL文の列名の長さは最大1,024バイトです。
LIKE句では、最大5つのワイルドカード (
%
) がサポートされています。in句では、最大1,024個の定数がサポートされます。
CSVオブジェクトの最大列サイズと行サイズは256 KBです。
SQL文の最大サイズは16 KBです。 WHERE句の後に最大20個の式を追加できます。 各ステートメントは、最大100の集計操作をサポートします。
デフォルトでは、エンジン条件プッシュダウン機能は無効になっています。 この機能を有効にするには、SET SESSION optimizer_switch='engine_condition_pushdown=on';
ステートメントを実行します。
上記の条件を満たすクエリは、リモートOSSバケットにプッシュダウンされます。 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)
プッシュされたエンジン条件
の後の条件でのクエリは、リモートOSSバケットにプッシュダウンできます。'name' LIKE "% 1% %%%%"
およびGROUP BY 'id' ORDER BY 'id' DESC
の条件でのクエリは、ローカルOSSサーバーでのみ実行できます。OSS外部テーブルの実行計画を
ツリー
形式で表示します。 例:EXPLAIN FORMAT=tree SELECT SELECT count(*) FROM `t1` WHERE `id` > 5 AND `id` < 100 AND `name` LIKE "%1%%%%%" Y `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)
条件の後のクエリ
エンジン条件:
リモートOSSバケットにプッシュできます。'name' LIKE "% 1% %%%%"
およびGROUP BY 'id' ORDER BY 'id' DESC
の条件でのクエリは、ローカルOSSサーバーでのみ実行できます。説明データのクエリには、PolarDB for MySQL 8.0.2クラスターを使用する必要があります。 バージョン番号を照会して、クラスターバージョンを確認できます。
OSS外部テーブルの実行プランを
JSON
形式で表示します。 例: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)
条件の後のクエリ
エンジン条件:
リモート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.
ヒントまたは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'; # Set the engine_condition_pushdown parameter to off. In this case, the engine condition pushdown feature is disabled for all queries in the current session.
次のステートメントを実行して、optimizer_switch変数の値に基づいて、現在のセッションのすべてのクエリでエンジン条件のプッシュダウン機能が有効になっているかどうかを判断できます。
select @@optimizer_switch;
複数のノード間でOSSサーバー情報を同期する
PolarDBクラスターのプライマリノードと読み取り専用ノードは、同じOSSサーバーを共有します。 これにより、これらのノードがOSSデータにアクセスできるようになります。 これらのノード間のOSSサーバー情報の同期は、これらのノードでの操作が独立していることを保証するためにロックフリーです。
OSSサーバー情報を変更すると、変更はロックフリーで読み取り専用ノードに同期されます。 読み取り専用ノード上のスレッドがOSSサーバーのロックを保持している場合、OSSサーバー情報の同期が遅れる可能性があります。 この場合、/* force_node='pi-bpxxxxxxxx' * /flush privileges;
または /* force_node='pi-bpxxxxxxxx' * /flush table oss_foreign_table;
ステートメントを実行して、読み取り専用ノードのOSSサーバー情報を手動で更新できます。