このトピックでは、OSSファイルフィルター機能を使用してコールドデータクエリを高速化する方法について説明します。
背景情報
OSSの普及に伴い、より多くのデータがOSSに保存されています。 低クエリパフォーマンスの問題は着実に悪化しており、ユーザーエクスペリエンスに影響します。 コールドデータに対する並列クエリの実行はクエリを高速化できますが、コールドデータに対する並列クエリの実行は、OSSテーブルのスキャンプロセス中に多くのメモリ、接続、およびネットワーク帯域幅リソースを消費します。 ユーザーエクスペリエンスは引き続き影響を受けます。 したがって、クエリのパフォーマンスを向上させるには、OSSテーブルデータをすばやくフィルタリングする方法が必要です。
そのため、OSSファイルフィルター機能が導入されました。 この機能は、クエリ条件に基づいてスキャンする必要のないOSSデータブロックを除外します。 これにより、スキャンデータの量が減り、クエリのパフォーマンスが大幅に向上します。 この機能は、リソース効率を最適化するだけでなく、ユーザーエクスペリエンスを大幅に向上させます。
機能の概要
OSSファイルフィルター機能は、アーカイブされた各データブロックの統計を収集し、フィルターデータを生成し、フィルターデータをOSSに保存します。 システムは、プッシュされたクエリ条件とフィルタデータに基づいて、スキャンする必要のないデータブロックを除外します。 これにより、スキャンデータの量が減り、クエリ時間が短縮されます。 OSSコールドデータは、作成したOSSファイルフィルターでフィルターできます。 異なるフィルタリング方法は、異なるデータタイプに対して使用される。数値データは、データブロックの最小および最大統計を比較することによってフィルタリングされる。 文字列データは、文字マップを比較することによってフィルタリングされます。 BLOOMデータ型が指定されている場合は、BLOOMフィルターが使用されます。
OSSファイルフィルター機能は、順序付けられた数値データまたは部分的に順序付けられた数値データに対して優れています。 ただし、グローバルに順序付けられていないデータの場合は、フィルタリング効率を高めるためにBLOOMフィルタをお勧めします。
アーカイブされたデータは通常、優れた時系列を持つため、時間型の列をフィルタリングするとクエリのパフォーマンスが大幅に向上します。
前提条件
クラスターは、リビジョンバージョン8.0.2.2.25以降のMySQL 8.0.2である必要があります。
クラスターには、コールドデータアーカイブ機能が有効になっている必要があります。 詳細については、「コールドデータアーカイブの有効化」をご参照ください。
クラスタへの接続が確立される。 詳細については、「クラスターへの接続」をご参照ください。
OSSファイルフィルターは、CSV形式のOSSコールドデータに対してのみ作成できます。
テーブルに対して
OSSファイルフィルター
機能を有効にするには、テーブルにOSS META = 1
オプションが必要です。SHOW CREATE TABLE
文を実行して、CSV形式の現在のテーブルに対してOSS META
が有効になっているかどうかを確認できます。 結果にOSS META=1
が含まれている場合、現在のテーブルに対してOSS META
が有効になります。 詳細については、「コールドデータに対するDDL操作の実行」をご参照ください。SHOW CREATE TABLE t; *************************** 1. row *************************** Table: t Create Table: CREATE TABLE `t` ( `id` int(11) DEFAULT NULL ) /*!99990 800020213 STORAGE OSS */ ENGINE=CSV DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci /*!99990 800020204 NULL_MARKER='NULL' */ /*!99990 800020223 OSS META=1 */ 1 row in set (0.00 sec)
制限事項
ePQ機能を有効にした後は、OSSファイルフィルター機能を有効にすることはできません。
OSSファイルフィルター機能では、次の機能がサポートされています。=、<=>、<、<=、>=,>、BETWEEN、LIKE、IS NULL、およびIS NOT NULL。 パーセント記号はLIKE (LIKE 'ABC % ') の変数の右側にのみ追加できます。
次の表に、OSSファイルフィルター機能でサポートされているデータ型を示します。
カテゴリ
データ型
Integer
TINYINT
、SMALLINT
、MEDIUMINT
、INT
、BIGINT
、TINYINT UNSIGNED
、SMALLINT UNSIGNED
、MEDIUMINT UNSIGNED
、INT UNSIGNE
、BIGINT UNSIGNED
浮動小数点
フロート
、ダブル
固定小数点
デシマル
時間
DATE
、DATETIME
、TIME
、TIMESTAMP
String
CHAR
,VARCHAR
すべてのデータ型はBLOOMフィルターでサポートされています。
UUIDが文字列で格納されている場合は、BLOOMフィルターを作成することを推奨します。
string型の列では、大文字と小文字を区別する比較のみがサポートされます。
複数の条件間のAND演算はサポートされていますが、複数の条件間のOR演算はサポートされていません。
OSSテーブルにデータがない場合、クエリの高速化にOSSファイルフィルター機能を使用することはできません。
手順
コンソールで、クラスターパラメーター
loose_use_oss_meta
をONに設定し、USE_OSS_META
機能を有効にします。 クラスターパラメーターの設定方法の詳細については、「クラスターパラメーターとノードパラメーターの設定」をご参照ください。コンソールで、クラスターパラメーター
loose_optimizer_switch
をENGINE_CONDITION_PUSHDOWN=ON
に設定します。 クラスターパラメーターの設定方法の詳細については、「クラスターパラメーターとノードパラメーターの設定」をご参照ください。コンソールで、クラスターパラメーター
loose_csv_oss_file_filter
をONに設定し、OSSファイルフィルター
機能を有効にします。 クラスターパラメーターの設定方法の詳細については、「クラスターパラメーターとノードパラメーターの設定」をご参照ください。クラスターが接続されていることを確認します。 そうでない場合は、[クラスターへの接続] で指定されたとおりにクラスターに接続できます。 上記のパラメーターが設定されているかどうかを確認します。
-- Check whether the loose_csv_oss_file_filter parameter is set to ON SHOW VARIABLES LIKE 'oss_file_filter'; -- Check whether the use_oss_meta parameter is set to ON. SHOW VARIABLES LIKE 'use_oss_meta'; -- Check whether the loose_optimizer_switch parameter is set to ENGINE_CONDITION_PUSHDOWN=ON. SHOW VARIABLES LIKE 'optimizer_switch';
OSSファイルフィルタータイプ
OSS_FILE_FILTERオプションを追加することで、アーカイブテーブルのOSSファイルフィルターデータを指定できます。 OSS_FILE_FILTERオプションの形式は次のとおりです。
OSS_FILE_FILTER = 'field_filter[,field_filter]'
field_filter := field_name[:filter_type]
filter_type := bloom
デフォルトのOSSファイルフィルタータイプは、さまざまなデータタイプに対して定義されています。 デフォルトでは、数値と時間のデータは最小統計と最大統計を比較してフィルタリングされます。 文字列データは、文字マップを比較することによってフィルタリングされます。 BLOOMフィルターを使用して、すべてのデータ型をフィルターできます。
例
テーブルの手動アーカイブ時のOSSファイルフィルターの作成
テーブルを手動でアーカイブするときに、OSSファイルフィルターを作成できます。
-- Create a table that uses the specified structure.
CREATE TABLE `lineitem` (
`L_ORDERKEY` int(11) NOT NULL,
`L_PARTKEY` int(11) NOT NULL,
`L_SUPPKEY` int(11) NOT NULL,
`L_LINENUMBER` int(11) NOT NULL,
`L_QUANTITY` decimal(15,2) NOT NULL,
`L_EXTENDEDPRICE` decimal(15,2) NOT NULL,
`L_DISCOUNT` decimal(15,2) NOT NULL,
`L_TAX` decimal(15,2) NOT NULL,
`L_RETURNFLAG` char(1) COLLATE utf8_bin NOT NULL,
`L_LINESTATUS` char(1) COLLATE utf8_bin NOT NULL,
`L_SHIPDATE` date NOT NULL,
`L_COMMITDATE` date NOT NULL,
`L_RECEIPTDATE` date NOT NULL,
`L_SHIPINSTRUCT` char(25) COLLATE utf8_bin NOT NULL,
`L_SHIPMODE` char(10) COLLATE utf8_bin NOT NULL,
`L_COMMENT` varchar(44) COLLATE utf8_bin NOT NULL
) ENGINE = innodb;
-- Archive the table and create an OSS file filter in the L_ORDERKEY, L_LINENUMBER, and L_SHIPDATE columns of the table.
ALTER TABLE lineitem ENGINE = CSV STORAGE OSS
OSS_FILE_FILTER = 'L_ORDERKEY,L_LINENUMBER,L_SHIPDATE';
アーカイブテーブルでのOSSファイルフィルターの作成
アーカイブされたテーブルにOSSファイルフィルターを作成できます。
-- Create a table that uses the specified structure.
CREATE TABLE `lineitem` (
`L_ORDERKEY` int(11) NOT NULL,
`L_PARTKEY` int(11) NOT NULL,
`L_SUPPKEY` int(11) NOT NULL,
`L_LINENUMBER` int(11) NOT NULL,
`L_QUANTITY` decimal(15,2) NOT NULL,
`L_EXTENDEDPRICE` decimal(15,2) NOT NULL,
`L_DISCOUNT` decimal(15,2) NOT NULL,
`L_TAX` decimal(15,2) NOT NULL,
`L_RETURNFLAG` char(1) COLLATE utf8_bin NOT NULL,
`L_LINESTATUS` char(1) COLLATE utf8_bin NOT NULL,
`L_SHIPDATE` date NOT NULL,
`L_COMMITDATE` date NOT NULL,
`L_RECEIPTDATE` date NOT NULL,
`L_SHIPINSTRUCT` char(25) COLLATE utf8_bin NOT NULL,
`L_SHIPMODE` char(10) COLLATE utf8_bin NOT NULL,
`L_COMMENT` varchar(44) COLLATE utf8_bin NOT NULL
) ENGINE = CSV STORAGE OSS;
-- Create an OSS file filter in the L_ORDERKEY, L_LINENUMBER, L_SHIPDATE, and L_SHIPINSTRUCT columns of the archived table. The L_SHIPINSTRUCT column uses the BLOOM data type.
ALTER TABLE lineitem OSS_FILE_FILTER = 'L_ORDERKEY,L_LINENUMBER,L_SHIPDATE,L_SHIPINSTRUCT:BLOOM';
OSSファイルフィルターの使用
クエリ条件でOSSファイルフィルターが使用されている場合、クエリ条件はCSV形式のOSSコールドデータにプッシュダウンされます。 実行計画を照会して、プッシュダウンされた条件を表示できます。
-- Create a table that uses the specified structure.
CREATE TABLE `lineitem` (
`L_ORDERKEY` int(11) NOT NULL,
`L_PARTKEY` int(11) NOT NULL,
`L_SUPPKEY` int(11) NOT NULL,
`L_LINENUMBER` int(11) NOT NULL,
`L_QUANTITY` decimal(15,2) NOT NULL,
`L_EXTENDEDPRICE` decimal(15,2) NOT NULL,
`L_DISCOUNT` decimal(15,2) NOT NULL,
`L_TAX` decimal(15,2) NOT NULL,
`L_RETURNFLAG` char(1) COLLATE utf8_bin NOT NULL,
`L_LINESTATUS` char(1) COLLATE utf8_bin NOT NULL,
`L_SHIPDATE` date NOT NULL,
`L_COMMITDATE` date NOT NULL,
`L_RECEIPTDATE` date NOT NULL,
`L_SHIPINSTRUCT` char(25) COLLATE utf8_bin NOT NULL,
`L_SHIPMODE` char(10) COLLATE utf8_bin NOT NULL,
`L_COMMENT` varchar(44) COLLATE utf8_bin NOT NULL
) ENGINE = CSV STORAGE OSS OSS_FILE_FILTER = 'L_ORDERKEY,L_LINENUMBER,L_SHIPDATE';
-- Query the execution plan.
explain select * from lineitem where l_orderkey=96;
+----+-------------+----------+------------+------+---------------+------+---------+------+---------+----------+---------------------------------------------------------------------------------+
| id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |
+----+-------------+----------+------------+------+---------------+------+---------+------+---------+----------+---------------------------------------------------------------------------------+
| 1 | SIMPLE | lineitem | NULL | ALL | NULL | NULL | NULL | NULL | 6001215 | 10.00 | Using where; With pushed engine condition (`test`.`lineitem`.`L_ORDERKEY` = 96) |
+----+-------------+----------+------------+------+---------------+------+---------+------+---------+----------+---------------------------------------------------------------------------------+
explain format = tree select * from lineitem where l_orderkey=96 \G
*************************** 1. row ***************************
EXPLAIN: -> Filter: (lineitem.L_ORDERKEY = 96) (cost=15010.00 rows=10000)
-> Table scan on lineitem, extra (oss_file_filter conditions: (lineitem.L_ORDERKEY = 96)) (cost=15010.00 rows=100000)
-- Execute the SQL query statement.
select count(*) from lineitem where l_orderkey=96;