PolarDB では、Object Storage Service (OSS) 外部テーブルを使用して、OSS に保存されている CSV 形式のデータを直接クエリできます。これにより、ストレージコストを効果的に削減できます。このトピックでは、OSS 外部テーブルを使用して 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~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 進値
日付と時刻のデータ型
データ型
サイズ
データ範囲
フォーマット
説明
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-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 桁の数字が必要です。たとえば、2020 年 1 月 1 日は、2020-1-1 ではなく 2020-01-01 と記述する必要があります。 2020-1-1 が OSS にプッシュダウンされた場合、クエリは期待どおりに実行されません。
文字列型
データ型
サイズ
説明
CHAR
0~255 バイト
固定長文字列
VARCHAR
0~65535 バイト
可変長文字列
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 値を挿入するには、テーブルの作成時に
NULL_MARKER
を設定する必要があります。 OSS 外部テーブルの場合、NULL_MARKER
のデフォルト値は NULL です。SHOW CREATE TABLE
文を実行して、NULL_MARKER の値を確認できます。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 外部テーブルの対応するフィールドのデータ型と一致しない場合は、エラーが報告されます。NULL_MARKER
値には数字のみを含めることはできず、空にすることもできません。また、次の 4 文字を含めることはできません。"
、\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 | +------+----------+---------------------+
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)
パラメータ
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 を使用する場合、OSS の合計メモリ使用量を現在のノードのメモリ容量の 5% に制限することをお勧めします。そうしないと、メモリ不足の問題が発生する可能性があります。
手順
OSS サーバーの作成
OSS サーバーを作成して OSS 接続情報を追加し、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 | STRING | はい | OSS サーバー名。 説明 名前はグローバルに一意である必要があります。名前は最大 64 文字の長さで、大文字と小文字は区別されません。 64 文字を超える名前は自動的に切り詰められます。OSS サーバー名を引用符で囲んだ文字列として指定できます。 |
my_database_name | String | いいえ | CSV ファイルの OSS ディレクトリ。 説明 作成した OSS サーバーに |
my_oss_endpoint | STRING | はい | OSS サーバーのエンドポイント。 説明 Alibaba Cloud サーバーからデータベースにアクセスする場合は、インターネットトラフィックが発生しないように、内部エンドポイントを使用してください。内部エンドポイントには、「internal」というキーワードが含まれています。 たとえば、中国 (杭州) リージョンの OSS ノードの内部エンドポイントは、 |
my_oss_bucket | STRING | はい | データファイルが保存されているバケット。データをインポートする前に、OSS バケットを作成する必要があります。 説明 ネットワークレイテンシを PolarDB クラスタと同じゾーンにバケットをデプロイすることをお勧めします。 |
my_oss_access_key_id | STRING | はい | RAM ユーザーまたは Alibaba Cloud アカウントの AccessKey ID。 |
my_oss_access_key_secret | STRING | はい | RAM ユーザーまたは Alibaba Cloud アカウントの AccessKey Secret。 |
my_oss_prefix | String | いいえ | CSV ファイルの OSS ディレクトリ。 |
my_oss_sts_token | String | いいえ | Security Token Service (STS) によって提供される一時的なアクセス認証情報。 説明
|
以前のバージョンのクラスタ用のステートメント
クラスタが次の要件を満たしている場合、このセクションの作成構文が適用されます。
MySQL 8.0.1 のクラスタで、リビジョンバージョンが 8.0.1.1.25.4~8.0.1.1.28 である。
MySQL 8.0.2 のクラスタで、リビジョンバージョンが 8.0.2.2.1~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
パラメータと oss_sts_token
パラメータはサポートされていません。
次の表に、構文のパラメータを示します。
パラメータ | データ型 | 必須 | コンポーネント |
server_name | STRING | はい | OSS サーバー名。 説明 名前はグローバルに一意である必要があります。名前は最大 64 文字の長さで、大文字と小文字は区別されません。 64 文字を超える名前は自動的に切り詰められます。OSS サーバー名を引用符で囲んだ文字列として指定できます。 |
my_database_name | String | いいえ | CSV ファイルの OSS ディレクトリの名前。 |
my_oss_endpoint | STRING | はい | OSS サーバーのエンドポイント。 説明 Alibaba Cloud サーバーからデータベースにアクセスする場合は、インターネットトラフィックが発生しないように、内部エンドポイントを使用してください。内部エンドポイントには、「internal」というキーワードが含まれています。 例: |
my_oss_bucket | STRING | はい | データファイルが保存されているバケット。データをインポートする前に、OSS バケットを作成する必要があります。 |
my_oss_access_key_id | STRING | はい | RAM ユーザーまたは Alibaba Cloud アカウントの AccessKey ID。 |
my_oss_access_key_secret | STRING | はい | RAM ユーザーまたは Alibaba Cloud アカウントの AccessKey Secret。 |
OSS サーバーを作成するには、SERVERS_ADMIN
権限が必要です。 SHOW GRANTS FOR username;
文を実行して、現在のユーザーに SERVERS_ADMIN
権限があるかどうかを確認できます。特権アカウントはデフォルトで SERVERS_ADMIN 権限を持っており、標準アカウントに 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 コンソール] でクラスターを見つけ、クラスター ID または名前をクリックしてクラスター詳細ページに移動します。左側のナビゲーションウィンドウで、 を選択します。 [ユーザーアカウント] タブで、管理する特権アカウントを見つけ、 [アクション] 列の [権限のリセット] をクリックします。権限がリセットされるまで待ちます。その後、特権アカウントはSERVERS_ADMIN
権限を持ちます。特権アカウントを使用している場合は、
SELECT Server_name, Extra_server_info FROM mysql.servers;
文を実行して、作成した OSS サーバーの情報を表示できます。セキュリティ上の理由から、oss_access_key_id
パラメータとoss_access_key_secret
パラメータの値は暗号化されています。
データのアップロード
ossutil ツール を使用して、ローカルの CSV ファイルをリモートの OSS バケットにアップロードできます。
CSV ファイルの OSS ディレクトリは、OSS サーバーの
DATABASE
ディレクトリまたはoss_prefix
ディレクトリである必要があります。CSV ファイル名は
OSS 外部テーブル名.CSV
である必要があり、CSV 拡張子はすべて大文字にする必要があります。たとえば、OSS 外部テーブル名がt1
の場合、CSV ファイル名はt1.CSV
である必要があります。CSV ファイルのデータフィールドは、OSS 外部テーブルのフィールドと一致する必要があります。たとえば、OSS 外部テーブル
t1
にINT
型のフィールドid
のみがある場合、CSV ファイルにはINT
型のフィールドが 1 つだけ存在できます。ローカルの MySQL データファイルを直接アップロードし、テーブル定義に基づいて OSS 外部テーブルを作成することをお勧めします。
OSS 外部テーブルの作成
OSS サーバーを定義したら、PolarDB 上に OSS 外部テーブルを作成して OSS に接続できます。例:
CREATE TABLE <table_name> (create_definition,...) engine=csv connection="<connection_string>";
connection_string
の値は、スラッシュ(/
)で区切られた次の項目で構成されます。
OSS サーバー名。
オプション。OSS 内のデータファイルのパス。
説明クラスタが次の要件を満たしている場合、OSS 内のデータファイルのパスを設定できます。
MySQL 8.0.1 のクラスタで、リビジョンバージョンが 8.0.1.1.28 以降である。
MySQL 8.0.2 のクラスタで、リビジョンバージョンが 8.0.2.2.5 以降である。
(オプション)データファイル名。
説明データファイル名には、
.CSV
拡張子を含めることはできません。データファイル名を指定しない場合、現在のテーブルに対応する OSS ファイルは
現在のテーブルの名前.CSV
です。データファイル名を指定した場合、現在のテーブルに対応する OSS ファイルは指定されたデータファイル名.CSV
です。OSS 内のデータファイルのパスを設定する場合は、ファイル名を指定する必要があります。そうしないと、システムがデータファイルを検索するときに、パスの最後のセグメントがファイル名と見なされます。
OSS 外部テーブルの表示
OSS 外部テーブルを作成したら、show create table
文を実行して OSS 外部テーブルを表示できます。作成されたテーブルのエンジンが 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 外部テーブルに対応するデータファイルを指定できます。たとえば、次の文は、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 エラー: OSS エンジンに対応するデータファイルがありません。 | 指定されたデータファイルが OSS に見つかりません。 | 上記のルールに基づいて、指定されたパスにデータファイルが OSS に存在するかどうかを確認します。
|
OSS 伝送用のメモリ領域が不足しています。現在要求されているメモリ %d。 | OSS クエリ用のメモリが不足しています。 | 次のいずれかの方法を使用して、このエラーを修正できます。
|
ERROR 8054 (HY000): OSS エラー: エラーメッセージ: サーバーに接続できませんでした。 aliyun-mysql-oss.oss-cn-hangzhou-internal.aliyuncs.com:80 への接続に失敗しました; | 現在のクラスタは OSS サーバーに接続できません。 | 現在のクラスタが OSS バケットと同じゾーンにあるかどうかを確認します。
|
クエリの最適化
クエリプロセス中に、クエリエンジンは特定の条件を持つクエリをリモート 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)
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%%%%%" 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)
engine conditions:
の後の条件を持つクエリは、リモート OSS バケットにプッシュダウンできます。`name` LIKE "%1%%%%%"
およびGROUP BY `id` ORDER BY `id` DESC
の条件を持つクエリは、ローカル OSS サーバーでのみ実行できます。説明データをクエリするには、PolarDB for MySQL 8.0.2 クラスタを使用する必要があります。 エンジンバージョン5.6、5.7、8.0 で、クラスタバージョンを確認できます。
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 conditions:
の後の条件を持つクエリは、リモート OSS バケットにプッシュダウンできます。`name` LIKE "%1%%%%%"
およびGROUP BY `id` ORDER BY `id` DESC
の条件を持つクエリは、ローカル OSS サーバーでのみ実行できます。
次のエラーが発生した場合、現在の OSS データファイルの一部の文字がエンジン条件プッシュダウンの要件を満たしていません。
OSS エラー: 現在のクエリはエンジン条件プッシュダウンをサポートしていません。 NO_ECP() ヒントを使用するか、optimizer_switch = 'engine_condition_pushdown=OFF' を設定して、条件プッシュダウン機能をオフにする必要があります。
ヒントまたは 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'; # engine_condition_pushdown パラメータを off に設定します。この場合、現在のセッションのすべてのクエリのエンジン条件プッシュダウン機能が無効になります。
次の文を実行して、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 サーバー情報を手動で更新できます。