热浪用户指南/最佳实践

第八章最佳实践

在本节中,在以下主题下描述了热浪最佳实践:

供应

要确定工作负载的适当热浪群集大小,请使用控制台中的自动配置功能生成节点计数估计。自动配置功能使用基于您选择的节点形状和MySQL DB系统中存在的数据的机器学习技术。有关说明,请参阅生成节点计数估计,在MySQL数据库服务用户指南

生成一个节点计数估算:

  • 当向DB系统添加一个HeatWave集群时,确定要加载的数据所需的节点数。

  • 定期,以确保您的数据有适当数量的HeatWave节点。随着时间的推移,数据大小可能会增加或减少,因此通过执行节点数估计来监视数据大小非常重要。

  • 运行查询时遇到内存不足错误。在这种情况下,可能是HeatWave集群的内存容量不足。

  • 当数据增长率较高时。

  • 当交易率(更新率和插入率)很高时。

将数据导入MySQL DB系统

MySQL Shell是推荐的实用程序,用于将数据导入MySQL DB系统。MySQL Shell转储和装载实用程序是用于MySQL数据库服务的专用式;适用于所有类型的出口和进口。MySQL Shell支持导出到,导入和导入对象存储。MySQL的最低支持源版本为5.7.9。有关更多信息,请参见导入和导出数据库,在MySQL数据库服务用户指南

入站复制

对于驻留在MySQL服务器内部实例中的OLTP工作负载,建议使用入站复制将数据复制到MySQL DB系统,以便卸载到HeatWave集群。有关更多信息,请参见复制,在MySQL数据库服务用户指南

准备数据

在准备加载到热浪中时建议使用以下实践:

  • 为了最小化您的数据所需的HeatWave节点的数量,排除不被分析查询访问的表列。有关排除列的信息,请参见第3.2节,“不包括表列”

  • 保存内存中的空间,设置charvarchar.,文本-type列长度到最长字符串值所需的最小长度。

  • 在适当的情况下,将字典编码应用于charvarchar.,文本类型列。字典编码减少了HeatWave集群节点上的内存消耗。在为字典编码选择字符串列时,使用以下条件:

    1. 该列不用作密钥加入查询。

    2. 您的查询不会执行诸如此类的操作就像字符串的子串CONCAT等等,在列上。可变长度编码支持字符串函数和运算符和就像谓词;词典编码没有。

    3. 该列的不同值数量有限。字典编码最适合具有有限数量不同值的列,例如国家列。

    4. 在更改传播期间,预计该列将添加很少的新值。避免对具有大量插入和更新的列进行字典编码。向字典编码列中添加大量新的惟一值可能导致更改传播失败。

    来自TPC Benchmark™H(TPC-H)的下列列提供了适合和不适合字典的字符串列的示例:

    • 订单。O_ORDERPRIORITY

      此列仅用于范围查询。与列关联的值有限。在更新期间,要添加大量新的,唯一的值,因此不太可能添加。这些特性使列适合于字典编码。

    • LINEITEM。L_COMMENT

      此列不用于连接或其他复杂表达式,但作为注释字段,值预计将是唯一的,使得列不适用于字典编码。

    当对选择编码类型有疑问时,使用变长编码,当表加载到HeatWave时默认应用该编码。

  • 当没有定义数据放置键时,数据按表的主键进行分区。如果按主键对数据进行分区不能提供合适的性能,则只考虑定义数据放置键。

    保留使用数据放置密钥以获取最耗时的查询。在这种情况下,定义数据放置键:

    • 最常使用的加入钥匙。

    • 最长的运行查询的键。

加载数据中

将数据加载到热浪中可以分为三种类型:初始散装载荷增量批量加载,改变传播

  • 初始散装载荷:第一次将数据加载到HeatWave时,或在失败或有意停止后重新加载数据时执行。执行初始批量加载的最佳时间是在非高峰时段,因为批量加载操作可能会影响MySQL DB系统上的OLTP性能。

  • 增量批量加载:执行时,有大量的数据加载到表,已加载在HeatWave。增量散装负载包括以下步骤:

    1. 执行一个SECONDARY_UNLOAD操作从热浪卸下表格。看第五章,卸下表

    2. 将数据导入MySQL DB系统节点上的表中。看导入和导出数据库MySQL数据库服务用户指南

    3. 执行一个SECONDARY_LOAD操作将表重新加载到HeatWave中。看第4章,加载数据中

    根据数据量,增量批量负载可以是加载新数据的更有利的方法,而不是等待发生变化传播。当加载新数据时,它还提供了更大的控制。与初始构建负载一样,执行增量批量负载的最佳时间是在非高峰时段,因为批量负载操作可能会影响MySQL DB系统上的OLTP性能。

  • 改变传播:将表加载到热浪中后,数据变化会自动传播Innodb.MySQL数据库系统上的表到他们的对应表在HeatWave。看改变传播

使用以下策略来提高负载性能:

  • 增加读线程数

    对于中型到大型表,通过设置innodb_parallel_read_threadsMySQL DB系统上的变量。

    mysql> set session innodb_parallel_read_threads = 32;

    如果MySQL DB系统不忙,则可以将值增加到64。

  • 并发负载表

    如果你有许多中小型表(小于20GB),从多个会话加载表:

    第1次:MySQL> Alter表供应商exossion_load;第2节:MySQL> Alter Table Parts exted_Load;第3节:MySQL> Alter表格region ededute_load;第4节:MySQL> ALTER TABLE PASSUPPP exted_Load;
  • 避免或减少冲突操作

    数据加载操作在MySQL DB系统上使用其他OLTP DML和DDL操作共享资源。为了提高负载性能,避免或减少冲突的DDL和DML操作。例如,避免运行DDL和大型DML操作LINEITEM表,同时执行修改表lineitem secondary_load手术。

运行查询

运行查询时建议使用以下实践:

  • 如果查询无法卸载,并且无法识别原因,请启用跟踪和查询INFORMATION_SCHEMA。OPTIMIZER_TRACE表调试查询。看调试查询

    如果优化器跟踪未返回所有跟踪信息,请增加优化器跟踪缓冲区大小。这遗漏_bytes_beyond_max_mem_size.栏目INFORMATION_SCHEMA。OPTIMIZER_TRACE表显示跟踪中缺少多少个字节。如果列显示非零值,则增加optimizer_trace_max_mem_size相应的设置。例如:

    设置optimizer_trace_max_mem_size = 1000000;
  • 如果一个INFORMATION_SCHEMA。OPTIMIZER_TRACE查询跟踪表示尚未支持子查询,请尝试取消使用子查询。例如,以下查询包含子查询,并没有按照所示卸载解释输出,不显示使用二次引擎

    mysql> EXPLAIN SELECT COUNT(*) FROM orders o WHERE o_totalprice> (SELECT AVG(o_totalprice) FROM orders WHERE o_custkey=o.o_custkey)\G ***************************行  *************************** id: 1 select_type:主要表:o分区:空类型:所有possible_keys:零键:空key_len:零参考:空行:14862970过滤:100.00额外的:使用的地方  *************************** 2。row *************************** id: 2 select_type: DEPENDENT SUBQUERY table: orders partitions: NULL type: ALL possible_keys: NULL key: NULL key_len: NULL ref: NULL rows: 14862970 filtered: 10.00 Extra: Using where 2 rows in set, 2 warnings (0.00 sec)

    此查询可以重写为下面以使子查询中最卸载,以便可以卸载它。

    mysql> EXPLAIN SELECT COUNT(*) FROM orders o, (SELECT o_custkey, AVG(o_totalprice) a_totalprice FROM orders GROUP BY o_custkey)a WHERE o_custkey=a。o_custkey和o.o_totalprice > a.a_totalprice;
  • 默认情况下,选择查询被卸载到HeatWave执行,并回落到MySQL数据库系统,如果这是不可能的。若要强制在HeatWave集群上执行查询或在不可能的情况下失败,请设置use_secondary_engine变量强迫.在此模式下,a选择如果无法卸载,则返回错误。这use_secondary_engine变量可设置如下:

    • 使用一个执行查询前的语句:

      mysql> set session use_secondary_engine =强制
    • 使用一个SET_VAROptimizer在发出查询时提示:

      mysql> SELECT /*+ SET_VAR(use_secondary_engine = FORCED) */…从…
  • 如果在运行查询时遇到内存不足错误:

    1. 避免或重写产生笛卡尔产品的查询。在以下查询中,a加入谓词之间没有定义供应商国家这将导致查询从两个表中选择所有行:

      MySQL> Select S_NationKey,S_Suppkey,L_Comment来自LineItem,供应商,Nation,其中S_SuppKey = L_SuppKey限制10;ERROR 3015 (HY000): Out of memory in storage engine ' failed detected in RAPID;查询执行无法继续'。

      为避免笛卡尔积,请在供应商国家要过滤掉行的表:

      MySQL> Select S_NationKey,S_Supkkey,L_Comment来自LineItem,供应商,N_NationKey = N_NationKey和S_Suppkey = L_Supkkey限制10;
    2. 避免或重写生成MySQL Optimizer引入的笛卡尔产品的查询。由于缺乏质量统计或成本良好的决策,即使查询在所有参与表中定义了谓词,MySQL优化器也可以在查询中引入一个或多个笛卡尔产品。例如:

      mysql> SELECT o_orderkey, c_custkey, l_shipdate, s_nationkey, s_suppkey, l_comment FROM lineitem, supplier, nation, customer, orders WHERE c_custkey = o_custkey AND o_orderkey = l_orderkey AND c_nationkey = s_nationkey AND c_custkey < 3000000 LIMIT 10;ERROR 3015 (HY000): Out of memory in storage engine ' failed detected in RAPID;查询执行无法继续'。

      解释计划输出显示,前两个表项之间不存在公共谓词(国家供应商).

      mysql> EXPLAIN SELECT o_orderkey, c_custkey, l_shipdate, s_nationkey, s_suppkey, l_comment FROM lineitem, supplier, nation, customer, orders WHERE c_custkey = o_custkey AND o_orderkey = l_orderkey AND c_nationkey = s_nationkey AND c_nationkey = n_nationkey AND c_custkey < 3000000 LIMIT 10\G *************************** 1。row *************************** id: 1 select_type: SIMPLE table: supplier partitions: NULL type: ALL possible_keys: NULL key: NULL key_len: NULL ref: NULL rows: 99626 filtered: 100.00 Extra: Using secondary engine RAPID *************************** 2.输入如下字段:行*************************** id: 1 select_type: SIMPLE table: nation partitions: NULL type: ALL possible_keys: NULL key: NULL key_len: NULL ref: NULL rows: 25 filtered: 10.00 Extra: Using where;使用连接缓冲区(散列连接);使用辅助引擎快速*************************** 3.行**************************** id: 1 select_type: SIMPLE table: customer partitions: NULL type: ALL possible_keys: NULL key: NULL key_len: NULL ref: NULL rows: 1382274 filtered: 5.00 Extra: Using where; Using join buffer (hash join); Using secondary engine RAPID *************************** 4. row *************************** id: 1 select_type: SIMPLE table: orders partitions: NULL type: ALL possible_keys: NULL key: NULL key_len: NULL ref: NULL rows: 14862970 filtered: 10.00 Extra: Using where; Using join buffer (hash join); Using secondary engine RAPID *************************** 5. row *************************** id: 1 select_type: SIMPLE table: lineitem partitions: NULL type: ALL possible_keys: NULL key: NULL key_len: NULL ref: NULL rows: 56834662 filtered: 10.00 Extra: Using where; Using join buffer (hash join); Using secondary engine RAPID

      若要强制联接顺序,以便存在与每对表关联的谓词,请添加strice_join.暗示。例如:

      MySQL> Exploge Select Select Onderkey,C_CustKey,L_Shipdate,S_NationKey,S_Suppkey,L_Comment来自供应商STURPLEXT_JOIN客户Strument_Join Nation STRUED_JOIN NORDERS直接命令C_CUSTKEY = O_CUSTKEY和O_ORDERKEY = L_ORDERKEY = L_NATIONKEY = N_NATIONKEY = N_NATIONKEY = N_NATIONKEY = N_NATIONKEY <3000000限制10 \ G *************************** 1.行*************************** ID:1 Select_type:简单表:NULL类型:ALL ALESTER_KEYS:NULL键:NULL键:NULL REF:NULL REF:99626过滤:100.00额外:使用辅助引擎快速*************************** 2.行***************************** ID:1 Select_type:简单表:客户分区:NULL类型:ALL ALESE_KEYS:null键:null键:null ref:null行:1382274过滤:5.00额外:使用在哪里;使用连接缓冲区(散列连接);使用辅助引擎快速*************************** 3.行**************************** ID:1 select_type:简单表:null类型:null类型:all destains_keys:null键:null key_len:null ref:null行:25过滤:10.00额外:使用位置:使用连接缓冲区(散列连接);使用辅助发动机快速*************************** 4.行*************************** ID:1 select_type:简单表:ORDERS分区:NULL类型:ALL ALEST_KEYS:null键:null key_len:null ref:null行:14862970过滤:10.00额外:使用连接缓冲区(散列连接); Using secondary engine RAPID *************************** 5. row *************************** id: 1 select_type: SIMPLE table: lineitem partitions: NULL type: ALL possible_keys: NULL key: NULL key_len: NULL ref: NULL rows: 56834662 filtered: 10.00 Extra: Using where; Using join buffer (hash join); Using secondary engine RAPID
    3. 避免或重写产生非常大的结果集的查询。这是查询处理期间内存错误的常见原因。使用聚合函数,a通过...分组条款或一个限制子句减少结果集大小。

    4. 避免或重写生成非常大的中间结果集的查询。在某些情况下,可以通过添加大结果集来避免strice_join.提示,强制以递减选择性的方式执行连接顺序。

    5. 通过执行节点计数估计来检查数据大小。如果您的数据大大生长,则热波集群可能需要额外的节点。有关说明,请参阅生成节点计数估计,在MySQL数据库服务用户指南

    6. HeatWave优化网络使用而不是内存。属性运行查询min_mem_consumption.通过设置设置的策略rapid_execution_strategymin_mem_consumption..这rapid_execution_strategy变量可设置如下:

      • 使用一个执行查询前的语句:

        mysql> set session rapt_execution_strategy = min_mem_consumption;
      • 使用一个SET_VAROptimizer在发出查询时提示:

        mysql> select / * + set_var(Rapid_execution_strategy = min_mem_consumption)* / ...来自...
      • 卸载未使用的表。这些表不必要地消耗了HeatWave节点上的内存。看第五章,卸下表

      • 除了查询中未访问的表列。这些列不必要地消耗热浪节点上的存储器。此策略需要重新加载数据。看第3.2节,“不包括表列”

监测

建议使用以下监控实践:

  • 监控操作系统内存使用情况。使用控制台设置一个告警,当HeatWave节点上的内存使用长时间保持在450GB以上时通知您。如果内存使用率超过此阈值,可以减少数据大小或向HeatWave集群添加节点。有关使用指标、告警和通知的信息,请参阅MySQL数据库服务指标,在MySQL数据库服务用户指南

  • 监视更改传播状态。如果更改传播被中断,表数据就会过时,并且访问具有过时数据的表的查询不会被卸载。有关说明,请参阅改变传播

重新加载数据

建议在以下情况下重新加载数据:

  • 通过添加或删除节点调整群集大小之后。重新加载数据在调整大小集群的所有节点之间分配数据。

  • 维护窗口后。维护涉及重新启动,这要求您将数据重新加载到热浪中。考虑设置MySQL数据库服务事件通知或服务连接器集线器通知,以便在发生更新时通知您。

  • 重启HeatWave集群时。在这种情况下,HeatWave集群中的数据丢失,需要重新加载。