Mysql 给大表加索引 影子策略

方案思路

此方法来自《高性能MySQL》一书中的方案。

  • 创建一张与原表(tb)结构相同的新表(tb_new)
  • 在新表上创建索引
  • 重命名原表为其他表名(tb => tb_tmp),新表重命名为原表名(tb_new => tb),此时新表(tb)承担业务
  • 为原表(tb_tmp)新增索引
  • 交换表,新表改回最初的名称(tb => tb_new),原表改回最初的名称(tb_tmp => tb),原表(tb)重新承担业务
  • 把新表数据导入原表(即把新表承担业务期间产生的数据和到原表中)
  • 如何实践

以下sql对应上面六步

create table tb_new like tb;

alter table tb_new add index idx_col_name (col_name);

rename table tb to tb_tmp, tb_new to tb;

alter table tb_tmp add index idx_col_name (col_name);

rename table tb to tb_new, tb_tmp => tb;

insert into tb (col_name1, col_name2) select col_name1, col_name2 from tb_new;

“影子策略”有哪些问题?

步骤3之后,新表改为原表名后(tb)开始承担业务,步骤3到结束之前这段时间的新产生的数据都是存在新表中的,但是如果有业务对老数据进行修改或删除操作,那将无法实现,所以步骤3到结束这段时间可能会产生数据(更新和删除)丢失。


作者:spike

分类: Mysql

创作时间:2024-01-31

更新时间:2024-01-31

联系方式放在中括号之中例如[[email protected]],回复评论在开头加上标号例如:#1