MySQL线上索引创建

简述

如果在线上环境,需要新建一个索引,会发生什么,会不会导致不可用,具体的创建步骤又是啥。

首先肯定会有一段时间导致表不可用的,主要就是看不可用的时间长短。

在不同的版本上主要有三种创建方式:Copy Table方式、Inplace方式、Online方式

Copy Table方式

早期版本,直接通过复制表实现

步骤

1、先为原表table创建临时表table_copy。

2、向临时表table_copy添加索引。

3、将原表table数据查询后插入到临时表table_copy,在将原表table改名为table_1。

4、在将临时表table_copy改名为table

不可用

在创建的过程中原表是可读的,但是在查询插入阶段是不可写的。

Inplace方式

MySQL5.5版本,没有复制临时表,减少了空间消耗,相对copy方式是一种进步。

步骤

1、读取主表索引列数据,并对数据排序

2、直接新建索引

不可用

创建过程中原表可读不可写。

Online方式

MySQL5.6.7版本,在原本inplace的基础上增添了可写的功能,相对inplace又是一种进步。

步骤

1、使用inplace方式创建索引,不用临时表。

2、在遍历聚簇索引,收集记录插入到新索引的过程中,记录修改保存到row log

3、聚簇索引遍历结束,并将所有记录插入之后,重放row log,是的记录一致。

不可用

只有在步骤3,重放row log的过程中锁表不可写。