MySQL8 中文参考(八十八)(1)https://developer.aliyun.com/article/1565892
- 通过使用
EXPLAIN
可以查看给定连接是否可以被推送;当连接可以被推送时,可以在输出的Extra
列中看到对pushed join
的引用,如下例所示:
mysql> EXPLAIN -> SELECT e.first_name, e.last_name, t.title, d.dept_name -> FROM employees e -> JOIN dept_emp de ON e.emp_no=de.emp_no -> JOIN departments d ON d.dept_no=de.dept_no -> JOIN titles t ON e.emp_no=t.emp_no\G *************************** 1\. row *************************** id: 1 select_type: SIMPLE table: d type: ALL possible_keys: PRIMARY key: NULL key_len: NULL ref: NULL rows: 9 Extra: Parent of 4 pushed join@1 *************************** 2\. row *************************** id: 1 select_type: SIMPLE table: de type: ref possible_keys: PRIMARY,emp_no,dept_no key: dept_no key_len: 4 ref: employees.d.dept_no rows: 5305 Extra: Child of 'd' in pushed join@1 *************************** 3\. row *************************** id: 1 select_type: SIMPLE table: e type: eq_ref possible_keys: PRIMARY key: PRIMARY key_len: 4 ref: employees.de.emp_no rows: 1 Extra: Child of 'de' in pushed join@1 *************************** 4\. row *************************** id: 1 select_type: SIMPLE table: t type: ref possible_keys: PRIMARY,emp_no key: emp_no key_len: 4 ref: employees.de.emp_no rows: 19 Extra: Child of 'e' in pushed join@1 4 rows in set (0.00 sec)
- 注意
如果内连接的子表通过ref
连接,并且结果按排序索引排序或分组,该索引无法提供排序行,这将强制写入到排序临时文件。
还有两个关于推送连接性能的额外信息来源:
- 状态变量
Ndb_pushed_queries_defined
、Ndb_pushed_queries_dropped
、Ndb_pushed_queries_executed
和Ndb_pushed_reads
。 - 属于
DBSPJ
内核块的ndbinfo.counters
表中的计数器。
ndb_log_apply_status
命令行格式 | --ndb-log-apply-status[={OFF|ON}] |
系统变量 | ndb_log_apply_status |
范围 | 全局 |
动态 | 否 |
SET_VAR 提示适用 |
否 |
类型 | 布尔值 |
默认值 | OFF |
- 一个只读变量,显示服务器是否使用
--ndb-log-apply-status
选项启动。 ndb_log_bin
命令行格式 | --ndb-log-bin[={OFF|ON}] |
系统变量 | ndb_log_bin |
范围 | 全局,会话 |
动态 | 否 |
SET_VAR 提示适用 |
否 |
类型 | 布尔值 |
默认值(≥ 8.0.16-ndb-8.0.16) | OFF |
默认值(≤ 8.0.15-ndb-8.0.15) | ON |
- 导致
NDB
表的更新写入二进制日志。如果服务器尚未使用log_bin
启用二进制日志记录,则此变量的设置不起作用。在 NDB 8.0 中,ndb_log_bin
默认为 0(FALSE)。 ndb_log_binlog_index
命令行格式 | --ndb-log-binlog-index[={OFF|ON}] |
系统变量 | ndb_log_binlog_index |
作用域 | 全局 |
动态 | 是 |
SET_VAR 提示适用 |
否 |
类型 | 布尔值 |
默认值 | ON |
- 导致将时代映射到二进制日志中的位置插入
ndb_binlog_index
表中。如果服务器尚未使用log_bin
启用二进制日志记录,则设置此变量不起作用。(此外,ndb_log_bin
不能被禁用。)ndb_log_binlog_index
默认为1
(ON
);通常,在生产环境中永远不需要更改此值。 ndb_log_empty_epochs
命令行格式 | --ndb-log-empty-epochs[={OFF|ON}] |
系统变量 | ndb_log_empty_epochs |
作用域 | 全局 |
动态 | 是 |
SET_VAR 提示适用 |
否 |
类型 | 布尔值 |
默认值 | OFF |
- 当此变量设置为 0 时,没有更改的时代事务不会写入二进制日志,尽管在
ndb_binlog_index
中仍会为空时代写入一行。 ndb_log_empty_update
命令行格式 | --ndb-log-empty-update[={OFF|ON}] |
系统变量 | ndb_log_empty_update |
作用域 | 全局 |
动态 | 是 |
SET_VAR 提示适用 |
否 |
类型 | 布尔值 |
默认值 | OFF |
- 当此变量设置为
ON
(1
)时,即使启用了log_replica_updates
或log_slave_updates
,没有更改的更新事务也会写入二进制日志。 ndb_log_exclusive_reads
命令行格式 | --ndb-log-exclusive-reads[={OFF|ON}] |
系统变量 | ndb_log_exclusive_reads |
范围 | 全局,会话 |
动态 | 是 |
SET_VAR 提示适用 |
否 |
类型 | 布尔 |
默认值 | 0 |
- 此变量确定是否使用独占锁记录主键读取,从而允许基于读取冲突的 NDB 集群复制冲突检测和解决。要启用这些锁,请将
ndb_log_exclusive_reads
的值设置为 1。默认情况下,禁用此类锁定的值为 0。
有关更多信息,请参见 读取冲突检测和解决。 ndb_log_orig
命令行格式 | --ndb-log-orig[={OFF|ON}] |
系统变量 | ndb_log_orig |
范围 | 全局 |
动态 | 否 |
SET_VAR 提示适用 |
否 |
类型 | 布尔 |
默认值 | OFF |
- 显示原始服务器 ID 和时代是否记录在
ndb_binlog_index
表中。使用--ndb-log-orig
服务器选项设置。 ndb_log_transaction_id
系统变量 | ndb_log_transaction_id |
范围 | 全局 |
动态 | 否 |
SET_VAR 提示适用 |
否 |
类型 | 布尔 |
默认值 | OFF |
- 此只读的布尔系统变量显示一个副本 mysqld 是否在二进制日志中写入 NDB 事务 ID(使用
NDB$EPOCH_TRANS()
冲突检测来使用“主动-主动”NDB 集群复制所需)。要更改设置,请使用--ndb-log-transaction-id
选项。ndb_log_transaction_id
在主流 MySQL Server 8.0 中不受支持。
有关更多信息,请参见 第 25.7.12 节,“NDB 集群复制冲突解决”。 ndb_log_transaction_compression
命令行格式 | --ndb-log-transaction-compression |
引入 | 8.0.31-ndb-8.0.31 |
系统变量 | ndb_log_transaction_compression |
范围 | 全局 |
动态 | 是 |
SET_VAR 提示适用 |
否 |
类型 | 布尔值 |
默认值 | OFF |
- 副本mysqld是否在二进制日志中写入压缩事务;仅在mysqld编译支持
NDB
时存在。
使用--binlog-transaction-compression
启动 MySQL 服务器会强制启用此变量(ON
),这将覆盖在命令行或my.cnf
文件中设置的--ndb-log-transaction-compression
,如下所示:
$> mysqld_safe --ndbcluster --ndb-connectstring=127.0.0.1 \ --binlog-transaction-compression=ON --ndb-log-transaction-compression=OFF & [1] 27667 $> 2022-07-07T12:29:20.459937Z mysqld_safe Logging to '/usr/local/mysql/data/myhost.err'. 2022-07-07T12:29:20.509873Z mysqld_safe Starting mysqld daemon with databases from /usr/local/mysql/data $> mysql -e 'SHOW VARIABLES LIKE "%transaction_compression%"' +--------------------------------------------+-------+ | Variable_name | Value | +--------------------------------------------+-------+ | binlog_transaction_compression | ON | | binlog_transaction_compression_level_zstd | 3 | | ndb_log_transaction_compression | ON | | ndb_log_transaction_compression_level_zstd | 3 | +--------------------------------------------+-------+
- 要仅为
NDB
表禁用二进制日志事务压缩,请在启动mysqld后在mysql或其他客户端会话中将ndb_log_transaction_compression
系统变量设置为OFF
。
在启动后设置binlog_transaction_compression
变量对ndb_log_transaction_compression
的值没有影响。
有关二进制日志事务压缩的更多信息,例如哪些事件被压缩或未压缩以及在使用此功能时需要注意的行为更改,请参阅第 7.4.4.5 节,“二进制日志事务压缩”。 ndb_log_transaction_compression_level_zstd
命令行格式 | --ndb-log-transaction-compression-level-zstd=# |
引入 | 8.0.31-ndb-8.0.31 |
系统变量 | ndb_log_transaction_compression_level_zstd |
范围 | 全局 |
动态 | 是 |
SET_VAR 提示适用 |
否 |
类型 | 整数 |
默认值 | 3 |
最小值 | 1 |
最大值 | 22 |
- 如果由
ndb_log_transaction_compression
启用,则用于将压缩事务写入副本二进制日志的ZSTD
压缩级别。如果mysqld未编译支持NDB
存储引擎,则不支持。
更多信息请参阅第 7.4.4.5 节,“二进制日志事务压缩”。 ndb_metadata_check
命令行格式 | --ndb-metadata-check[={OFF|ON}] |
引入 | 8.0.16-ndb-8.0.16 |
系统变量 | ndb_metadata_check |
范围 | 全局 |
动态 | 是 |
SET_VAR 提示适用 |
否 |
类型 | 布尔值 |
默认值 | ON |
NDB
使用一个后台线程每隔ndb_metadata_check_interval
秒检查一次元数据更改,与 MySQL 数据字典进行比较。可以通过将ndb_metadata_check
设置为OFF
来禁用此元数据更改检测线程。该线程默认情况下是启用的。ndb_metadata_check_interval
命令行格式 | --ndb-metadata-check-interval=# |
引入版本 | 8.0.16-ndb-8.0.16 |
系统变量 | ndb_metadata_check_interval |
范围 | 全局 |
动态 | 是 |
SET_VAR 提示适用 |
否 |
类型 | 整数 |
默认值 | 60 |
最小值 | 0 |
最大值 | 31536000 |
单位 | 秒 |
NDB
在后台运行一个元数据更改检测线程,以确定 NDB 字典相对于 MySQL 数据字典的更改。默认情况下,这些检查之间的间隔为 60 秒;可以通过设置ndb_metadata_check_interval
的值来调整。要启用或禁用线程,请使用ndb_metadata_check
。ndb_metadata_sync
引入版本 | 8.0.19-ndb-8.0.19 |
系统变量 | ndb_metadata_sync |
范围 | 全局 |
动态 | 是 |
SET_VAR 提示适用 |
否 |
类型 | 布尔值 |
默认值 | false |
- 设置此变量会导致更改监视线程覆盖为
ndb_metadata_check
或ndb_metadata_check_interval
设置的任何值,并进入持续更改检测期。当线程确定没有更多要检测的更改时,它会停滞���直到二进制日志线程完成所有检测到的对象的同步。然后ndb_metadata_sync
设置为false
,更改监视线程将恢复到由ndb_metadata_check
和ndb_metadata_check_interval
设置确定的行为。
在 NDB 8.0.22 及更高版本中,将此变量设置为true
会导致排除对象列表被清除,将其设置为false
会清除要重试的对象列表。 ndb_optimized_node_selection
命令行格式 | --ndb-optimized-node-selection=# |
系统变量 | ndb_optimized_node_selection |
范围 | 全局 |
动态 | 否 |
SET_VAR 提示适用 |
否 |
类型 | 整数 |
默认值 | 3 |
最小值 | 0 |
最大值 | 3 |
- 优化节点选择有两种形式,如下所述:
- SQL 节点使用接近性来确定事务协调器;也就是说,SQL 节点“最近”的数据节点被选择为事务协调器。为此,具有与 SQL 节点共享内存连接的数据节点被认为是与 SQL 节点“最近”的;接下来最接近的(按照减少接近性的顺序)是:从
localhost
的 TCP 连接,然后是从localhost
以外的主机的 TCP 连接。 - SQL 线程使用分布感知来选择数据节点。也就是说,由给定事务的第一个语句访问的集群分区所在的数据节点被用作整个事务的事务协调器。(仅当事务的第一个语句访问不超过一个集群分区时有效。)
- 此选项接受整数值
0
、1
、2
或3
中的一个。3
是默认值。这些值影响节点选择如下:
0
:节点选择未经优化。在 SQL 线程继续到下一个数据节点之前,每个数据节点被用作事务协调器 8 次。1
:接近 SQL 节点用于确定事务协调器。2
:使用分布感知来选择事务协调器。但是,如果事务的第一个语句访问多个集群分区,则 SQL 节点会在将此选项设置为0
时恢复到循环轮询行为。3
:如果可以使用分布感知来确定事务协调器,则使用它;否则使用接近性来选择事务协调器。(这是默认行为。)
- 接近性的确定如下:
- 从为
Group
参数设置的值开始(默认为 55)。 - 对于与其他 API 节点共享同一主机的 API 节点,将值减 1。假设
Group
的默认值,与 API 节点在同一主机上的数据节点的有效值为 54,远程数据节点为 55。 - 设置
ndb_data_node_neighbour
会进一步减少有效的Group
值 50,使得这个节点被视为最近的节点。只有当所有数据节点都在与 API 节点不同的主机上,并且希望将其中一个专用于 API 节点时才需要这样做。在正常情况下,前面描述的默认调整已经足够。
- 频繁更改
ndb_data_node_neighbour
是不明智的,因为这会改变集群连接的状态,从而可能破坏每个线程对新事务的选择算法,直到它稳定下来。 ndb_read_backup
命令行格式 | --ndb-read-backup[={OFF|ON}] |
系统变量 | ndb_read_backup |
作用范围 | 全局 |
动态 | 是 |
SET_VAR Hint Applies |
否 |
类型 | 布尔值 |
默认值 (≥ 8.0.19-ndb-8.0.19) | ON |
默认值 (≤ 8.0.18-ndb-8.0.18) | OFF |
- 启用随后创建的任何
NDB
表的任何片段副本读取;这样做可以极大地提高表的读取性能,对写入的成本相对较小。
如果 SQL 节点和数据节点使用相同的主机名或 IP 地址,则会自动检测到这一事实,因此首选将读取发送到同一主机。如果这些节点位于同一主机上但使用不同的 IP 地址,则可以通过将 SQL 节点上的ndb_data_node_neighbour
的值��置为数据节点的节点 ID 来告诉 SQL 节点使用正确的数据节点。
要为单个表启用或禁用从任何片段副本读取,您可以相应地为表设置NDB_TABLE
选项READ_BACKUP
,在CREATE TABLE
或ALTER TABLE
语句中;有关更多信息,请参见第 15.1.20.12 节,“设置 NDB 注释选项”。 ndb_recv_thread_activation_threshold
命令行格式 | --ndb-recv-thread-activation-threshold=# |
系统变量 | ndb_recv_thread_activation_threshold |
作用范围 | 全局 |
动态 | 是 |
SET_VAR Hint Applies |
否 |
类型 | 整数 |
默认值 | 8 |
最小值 | 0 (MIN_ACTIVATION_THRESHOLD) |
最大值 | 16 (MAX_ACTIVATION_THRESHOLD) |
MySQL8 中文参考(八十八)(3)https://developer.aliyun.com/article/1565894