E.37. mysql_fdw

E.37.1. Installation
E.37.2. Enhancements
E.37.3. Usage
E.37.4. Examples

本LightDB扩展实现了一个外部数据包装器(FDW),用于 MySQL

E.37.1. Installation

要编译 MySQL 外部数据包装器, 需要 MySQL 的 C 客户端库,默认版本为 8.0.26。该库可以从官方 MySQL 网站下载。

在库路径中也必须包含 mysql_config,它位于 MySQL 的 lib 目录中。

            $ export LD_LIBRARY_PATH=/usr/lib64/mysql/:$LD_LIBRARY_PATH
        

E.37.2. Enhancements

最新版本的 mysql_fdw 增加了以下增强功能:

E.37.2.1. Write-able FDW

以前的版本仅为只读,最新版本提供了写入功能。 用户现在可以使用 mysql_fdw 对外部表执行插入、更新和删除语句。 它使用 LightDB 类型转换机制来提供 MySQL 和 LightDB 数据类型之间的相反类型转换。

E.37.2.2. Connection Pooling

最新版本附带一个连接池,它为同一会话中的所有查询利用相同的 MySQL 数据库连接。 以前的版本会为每个查询打开一个新的 MySQL 数据库连接,这是一个性能增强。

E.37.2.3. WHERE clause push-down

最新版本将外部表的 WHERE 条件下推到外部服务器。 外部表上的 WHERE 条件将在外部服务器上执行,因此需要传输到 LightDB 的行数更少。 这是一个性能特性。

E.37.2.4. Column push-down

以前的版本从目标外部表获取所有列。 最新版本执行列下推,并仅返回选择目标列表中的列。 这是一个性能特性。

E.37.2.5. Prepared Statement

(重构 select 查询以使用预编译语句)

现在,select 查询使用预编译语句而不是简单查询协议。

E.37.2.6. JOIN push-down

mysql_fdw 现在还支持 JOIN 下推。 来自同一远程 MySQL 服务器的两个外部表之间的连接被推送到远程服务器,而不是获取两个表的所有行并在本地执行连接,从而提高性能。 目前,仅涉及关系和算术运算符的连接子句中的连接被下推以避免任何潜在的连接失败。 此外,仅支持 INNER 和 LEFT/RIGHT OUTER 连接,不支持 FULL OUTER、SEMI 和 ANTI 连接。 这是一个性能特性。

E.37.3. Usage

可以在 MySQL 外部服务器对象上设置以下参数:

  • host:MySQL 服务器的地址或主机名。默认值为 127.0.0.1

  • port:MySQL 服务器的端口号。默认值为 3306

  • secure_auth:启用或禁用安全身份验证。默认值为 true

  • init_command:连接到 MySQL 服务器时要执行的 SQL 语句。

  • use_remote_estimate:控制 mysql_fdw 是否发出远程 EXPLAIN 命令来获取成本估算。 默认值为 false

  • reconnect:启用或禁用自动重新连接到 MySQL 服务器的功能,如果发现现有连接已经丢失。 默认值为 false

  • ssl_key:客户端私钥文件的路径名。

  • ssl_cert:客户端公钥证书文件的路径名。

  • ssl_ca:证书授权机构(CA)证书文件的路径名。如果使用此选项,必须指定与服务器使用的证书相同的证书。

  • ssl_capath:包含可信 SSL CA 证书文件的目录的路径名。

  • ssl_cipher:SSL 加密的可允许的密码列表。

  • fetch_size:此选项指定 mysql_fdw 在每个获取操作中应获取的行数。 它可以为外部表或外部服务器指定。在表上指定的选项会覆盖为服务器指定的选项。 默认值为 100

可以在 MySQL 外部表对象上设置以下参数:

  • dbname:要查询的 MySQL 数据库的名称。这是一个必选项。

  • table_name:MySQL 表的名称,默认值与外部表相同。

  • max_blob_size:读取而不截断的最大 blob 大小。

  • fetch_size:与外部服务器的 fetch_size 参数相同。

创建用户映射时需要提供以下参数。

  • username:连接到 MySQL 时要使用的用户名。

  • password:用于鉴别连接到 MySQL 服务器的密码。

E.37.4. Examples

            -- load extension first time after install
            CREATE EXTENSION mysql_fdw;

            -- create server object
            CREATE SERVER mysql_server
            	FOREIGN DATA WRAPPER mysql_fdw
            	OPTIONS (host '127.0.0.1', port '3306');

            -- create user mapping
            CREATE USER MAPPING FOR LightDB
            	SERVER mysql_server
            	OPTIONS (username 'foo', password 'bar');

            -- create foreign table
            CREATE FOREIGN TABLE warehouse
            	(
            		warehouse_id int,
            		warehouse_name text,
            		warehouse_created timestamp
            	)
            	SERVER mysql_server
            	OPTIONS (dbname 'db', table_name 'warehouse');

            -- insert new rows in table
            INSERT INTO warehouse values (1, 'UPS', current_date);
            INSERT INTO warehouse values (2, 'TV', current_date);
            INSERT INTO warehouse values (3, 'Table', current_date);

            -- select from table
            SELECT * FROM warehouse ORDER BY 1;

            warehouse_id | warehouse_name | warehouse_created
            -------------+----------------+-------------------
                       1 | UPS            | 10-JUL-20 00:00:00
                       2 | TV             | 10-JUL-20 00:00:00
                       3 | Table          | 10-JUL-20 00:00:00

            -- delete row from table
            DELETE FROM warehouse where warehouse_id = 3;

            -- update a row of table
            UPDATE warehouse set warehouse_name = 'UPS_NEW' where warehouse_id = 1;

            -- explain a table with verbose option
            EXPLAIN VERBOSE SELECT warehouse_id, warehouse_name FROM warehouse WHERE warehouse_name LIKE 'TV' limit 1;

                                               QUERY PLAN
            --------------------------------------------------------------------------------------------------------------------
            Limit  (cost=10.00..11.00 rows=1 width=36)
            	Output: warehouse_id, warehouse_name
            	->  Foreign Scan on public.warehouse  (cost=10.00..1010.00 rows=1000 width=36)
            		Output: warehouse_id, warehouse_name
            		Local server startup cost: 10
            		Remote query: SELECT `warehouse_id`, `warehouse_name` FROM `db`.`warehouse` WHERE ((`warehouse_name` LIKE BINARY 'TV'))