MySQL加索引语句不加锁:ALGORITHM=INPLACE, LOCK=NONE

线上无锁添加索引:加索引的语句不加锁

ALTER TABLE tbl_name ADD PRIMARY KEY (column), ALGORITHM=INPLACE, LOCK=NONE;
ALGORITHM=INPLACE
更优秀的解决方案,在当前表加索引,步骤:
1.建立索引(二级索引)数据字典
2.加共享表锁,禁止DML,容许查询
3.读取聚簇索引,构造新的索引项,排序并插
入新索引
4.等待打开当前表的全部只读事务提交
5.建立索引结束

ALGORITHM=COPY
经过临时表建立索引,须要多一倍存储,还有更多的IO,步骤:
1.新建带索引(主键索引)的临时表
2.锁原表,禁止DML,容许查询
3.将原表数据拷贝到临时表
4.禁止读写,进行rename,升级字典锁
5.完成建立索引操做

LOCK=DEFAULT:默认方式,MySQL自行判断使用哪一种LOCK模式,尽可能不锁表
LOCK=NONE:无锁:容许Online DDL期间进行并发读写操做。若是Online DDL操
做不支持对表的继续写入,则DDL操做失败,对表修改无效
LOCK=SHARED:共享锁:Online DDL操做期间堵塞写入,不影响读取
LOCK=EXCLUSIVE:排它锁:Online DDL操做期间不容许对锁表进行任何操做