最近面试的时候有两次被问到大表增加索引怎么增加,流程说一说;
今天就爆肝整理一下:
表order有一千万数据,了我们给表order增加索引
看以下流程:
#操作步骤
#1、创建一张和原表结构一样的空表,只是表名不一样;
create table tb_name_tmp like tb_name;
#2、把新建的空表非主键索引都删掉,因为这样在往新表导数据的时候效率会很快(因为除了必要的主键以外,不用再去建立其它索引数据了)
alter tb_name_tmp drop index index_name;
#3、从旧表往主表里导数据,如果数据太大,建议分批导入,只需确保无重复数据就行,因为导入数据太大,会很占用资源(内存,磁盘io, cpu等),可能会影响旧表在线上的业务。我是每批次100万条数据导入,基本上每次都是在 20s左右;
insert into tb_name_tmp select * from tb_name where id between start_id and end_id;
#4、数据导完后,再对新表进行添加索引;
create index index_name on tb_name_tmp(column_name);
#5、当大部分数据导入后,索引也建立好了,但是旧表数据量还是会因业务的增长而增长,这时候为了确保新旧表的数据一至性和平滑切换,建议写一个脚本,判断当旧表的数据行数与新表一致时,就切换。我是以 max(id)来判断的。
table tb_name to tb_name_tmp1;
table tb_name_tmp to tb_name;