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的过程中锁表不可写。