更新时间:2025-04-23 gmt 08:00
ddl工具测试对比-j9九游会登录
测试步骤
- 创建4张表,表结构如下:
create table if not exists users ( `rid` bigint(20) unsigned not null auto_increment, `nid` bigint(20) default null, `level` int(11) default null, `vip` int(11) default null, `vip_exp` int(11) default null, `reg_channel` int(11) default null, `guild_id` bigint(20) unsigned default '0', `guild_open` tinyint(1) default '0', `forbid_login_time` bigint(20) default null, `forbid_talk_time` bigint(20) default null, `ctime` bigint(20) default null, `mtime` datetime(3) default null, `last_offline_time` bigint(20) default null, `friend_open` tinyint(1) default '0', `user_data_str` mediumblob, `name` varchar(64) default null, `db_fix_version` int(10) default '0', primary key (`rid`), key `idx_users_99_nid` (`nid`), key `idx_users_99_level` (`level`), key `idx_users_99_ctime` (`ctime`), key `idx_users_99_mtime` (`mtime`), key `idx_users_99_last_offline_time` (`last_offline_time`), key `idx_users_99_name` (`name`) ) engine=innodb auto_increment=4393751571200 default charset=utf8mb4;
- 分别给每张表插入3000万行数据。
- 使用mysql原生copy算法在表1中添加一列,并在执行过程中建立新会话执行select,update,insert操作10万条数据。
- 使用mysql原生inplace算法在表2添加一列,并在执行过程中建立新会话执行select,update,insert操作10万条数据。
- 使用gh-ost工具在表3中添加一列,并在执行过程中建立新会话执行select,update,insert操作10万条数据。
- 记录ddl和dml语句执行时间。
|
执行操作 |
mysql copy |
mysql inplace |
gh-ost |
|---|---|---|---|
|
增加一列 |
1294.29 |
755.52 |
1876.79 |
|
select |
1.35 |
1.29 |
1.29 |
|
update |
1266.78 |
0.19 |
0.11 |
|
insert |
1296.19 |
7.47 |
4.49 |
测试结果
- mysql原生copy算法:update、insert执行会阻塞,select语句可以正常执行。
- mysql原生inplace算法:不会长时间阻塞dml语句,且对大表添加一列耗时最短。
- gh-ost工具:几乎不阻塞dml语句,ddl添加一列耗时比mysql原生的两种算法时间长。
算法使用建议
采用inplace算法进行ddl操作时阻塞dml的时间很短,对主从时延无严格要求的客户,推荐直接使用社区已有能力快速完成表结构变更。对主从复制延迟容忍较低的业务,推荐使用gh-ost工具来完成ddl操作。使用了mysql 8.0.12版本及以上的用户,当满足instant算法条件时,可指定使用instant来减少ddl操作对业务的影响。
相关文档
意见反馈
文档内容是否对您有帮助?
提交成功!非常感谢您的反馈,我们会继续努力做到更好!
您可在查看反馈及问题处理状态。
系统繁忙,请稍后重试
如您有其它疑问,您也可以通过华为云社区问答频道来与我们联系探讨