快速更新与TokuDB¶
重要的
从雷竞技下载官网Percona Server for MySQL 8.0.28-19,不再支持TokuDB存储引擎。我们已经从安装包中删除了存储引擎,并在二进制构建中禁用了存储引擎。
从雷竞技下载官网Percona Server for MySQL 8.0.26-16,二进制构建和包包括但禁用TokuDB存储引擎插件。tokudb_enabled选项和tokudb_backup_enabled选项控制插件的状态,默认设置为FALSE。尝试加载插件的结果是插件无法初始化并打印弃用消息。
我们建议将数据迁移到MyRocks存储引擎。为了使插件能够迁移到另一个存储引擎,在my.cnf文件中将tokudb_enabled和tokudb_backup_enabled选项设置为TRUE,并重新启动服务器实例。然后,您可以加载插件。
中声明TokuDB存储引擎已弃用雷竞技下载官网Percona Server for MySQL 8.0。有关更多信息,请参阅Percona博客文章:雷竞技下载官网注意:TokuDB支持的变化和未来从Percona服务器删除MySQL 8.0雷竞技下载官网。
介绍¶
更新密集型应用的吞吐量会受到存储系统随机读容量的限制。吞吐量限制的原因是read-modify-write算法MySQL用于处理更新语句(从存储引擎读取一行,对其应用更新,将新行写回存储引擎)。
为了解决这个吞吐量限制,TokuDB提供一个实验性的快速更新特性,该特性使用不同的更新算法。SQL语句的更新表达式被编码成存储在更新分形树消息中的小程序。这个更新消息被注入到分形树索引的根中。最终,这些更新消息到达一个叶节点,更新程序将应用于该行。由于消息是分批在分形树级别之间移动的,因此在叶节点中读取的成本将摊销到许多更新消息上。
此特性可用于更新和插入语句,并且可以使用两个变量分别为它们打开/关闭。变量tokudb_enable_fast_update变量切换更新, tokudb_enable_fast_upsert执行相同的操作插入。
限制¶
如果执行的表达式满足条件的数量,快速更新将被激活,而不是普通的MySQL read-modify-write更新。
可以为语句或混合复制激活快速更新,
必须为所涉及的表定义主键,
支持简单主键和复合主键
int,字符或varchar是允许的数据类型,更新后的字段应该具有
整数或字符数据类型,作为任何键的一部分的字段都不应该更新,
不允许集群键,
不应该涉及触发因素,
支持的更新表达式应该属于以下类型之一:
X =常数X = X +常数X = X -常数X = if (X =0,0, X -1)X = X +个值
使用细节和示例¶
下面的例子创建了一个关联事件标识符及其计数的表:
创建表格t(event_id长整型数字无符号不零主要的关键,event_count长整型数字无符号不零);
许多映射到关系表的图应用程序可以使用重复的键插入和更新来维护图。例如,可以使用重复的键插入更新与图中的链接关联的元数据。如果应用程序不使用受影响的行,则可以将插入或更新标记为快速插入或快速更新并作为快速插入或快速更新执行。
插入的例子¶
如果不知道事件标识符(由event_id表示)是否已经存在于表中,那么插入……重复密钥更新…语句可以插入它(如果不存在),或者增加它的event_count。下面是一个带有重复键插入语句的示例,其中% id是某个特定的event_id值:
插入成t值(%id,1)在重复的关键更新event_count=event_count+1;
解释¶
如果事件id是随机的,那么这个应用程序的吞吐量将受到存储系统随机读容量的限制,因为每个事件id都是随机的插入语句必须确定这个event_id是否存在于表中。
TokuDB在分形树索引中插入一个“upsert”消息来替换主键是否存在。这个“upsert”消息包含一行的副本和增加event_count的程序。当分形树缓冲区被填满时,这个“upsert”消息就会沿着树被刷新。最终,消息到达一个叶节点并在那里执行。如果该键存在于叶节点中,则event_count将增加。否则,将新行插入到叶节点中。
更新的例子¶
如果已知event_id存在于表中,则更新语句可用于增加其event_count(同样,特定的event_id值在这里被写入为% id):
更新t集event_count=event_count+1在哪里event_id= %id;
解释¶
TokuDB生成一个“更新”消息更新语句及其更新表达式树,并将该消息插入分形树索引中。当消息最终到达叶节点时,从消息中提取增量程序并执行。