MySQL-添加索引或字段时如何不锁表

摘要:
向MySQL添加索引已完成以下步骤:1。在MySQL 5.5之前,添加索引如下:1。首先,创建一个与原始表具有相同数据结构的临时表,并添加要添加的索引。然而,仍然存在其他问题:这意味着此表只能在索引期间读取,不能添加、删除或修改。4、 MySQL 5.6开始支持在线创建--OnlineDDL,它只需要一行代码:以下是添加的辅助索引:ALTER TABLE_ name ADDINDEDXIndea_na_ name,ALGORITHM=INPLACE,LOCK=NONE;ALGORITHM指定创建或删除索引的算法。有以下类别:COPY:根据5.1之前的版本创建临时表的方法。

索引的添加MySQL经历了一下几个历程:

一 .在MySQL 5.5版本之前,添加索引具体是这样的:

1.首先创建一张临时表和原表数据结构相同,将你要添加的索引加上。

2.把原表数据导入临时表。

3.删除原表。

4.将临时表重命名为原表。

这样做有很大问题:

首先对于大数据量的导入需要很长的时间,那么在这段时间里新增或修改的数据没办法处理。

其次如果碰上大事务正在新增或更新更新这张原表还会锁表,你还没办法用sql去导入到临时表中。

二 .但在InnoDB 1.0版本开始,支持一种Fast Index(快速索引创建)的方式,简称FIC,他是这样做的:

对于辅助索引的创建,他不需要建临时表,他会直接将原表加S锁,这样就不会有数据导入的问题。

但还是会有些其他问题:

这意味着这加索引的这段时间里这张表只能读,不能增删改。而且不适用主键索引。

三. 针对一,二阶段的问题,Facebook总结并实现了一种在线执行方案-OSC:

1.初始化,检查原表所有的问题,包括主键,触发器,外键等。

2.创建临时表,添加索引字段。

3.创建deltas表,为下一步创建触发器做准备。

4.对原表创建增删改的触发器,触发器产生的草所记录写入到上一步创建的deltas表。

5.开始OSC操作的事务。

6.删除所有辅助索引,再将原表数据通过分片文件写入临时表。

7.将deltas表中产生的记录应用到临时表中。

8.重新创建辅助索引。

10.将原表和临时表交换名字,在这个过程中会锁表,但这个过程很快。

以上便是整个OSC过程,看起来就很复杂,实际的脚本也很复杂,光是核心PHP代码就2000多行,而且有一定局限性,对于分布式无法主从同步。

四.MySQL5.6版本开始支持在线创建--Online DDL,只需一行代码:

以下是对辅助索引的添加:

 ALTER TABLE table_name ADD INDEX  indea_name ,ALGORITHM=INPLACE,LOCK=NONE;

ALGORITHM指定创建或删除索引得算法,有以下几类:

COPY:按照5.1之前的版本,创建临时表的方式。

INPLACE:不需要创建临时表。

DEFAULT:表示根据参数old_alter_table来判断是用COPY还是INPLACE,默认OFF,表示采用INPLACE方式。

 LOCK表示加锁情况:

NONE:不添加任何锁,允许并发。

SHARE:加S锁。

EXCLUSIVE:加X锁,读写都不允许。

DEFAULT:会先判断是否可用NONE,若不能再判断是否可用SHARE模式,最后判断EXCLUSIVE。

Online DDL的原理是则好样的:

1.在创建或删除索引的同时,会将这段时间发生的增删改操作的日志写入一个缓存中,待完成索引后再重新将日志应用到表上,达到数据一致性。这个缓存的小由innodb_online_alter_log_max_size控制,默认128MB。可以根据情况调整。

需要注意的是,在这个过程中,sql不会用到正在创建的索引。

免责声明:文章转载自《MySQL-添加索引或字段时如何不锁表》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇shell 获取命令执行的结果,获取结果返回【转载】Python,使用Wheel打包下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

【流数据处理】MySql/PG/Oracle+Kafka+Flink(CDC捕获) 部署及实时计算

主要介绍实时数仓得部署、计算 文章主要分3部分 数据采集 $color{red}{[E]}$ 关系型数据库MySql/PG/Oracle+Debezium+Kafka Connector 数据计算 $color{red}{[T]}$ Flink 数据存储 $color{red}{[L]}$ 传输,关系型数据库/列式数据库 clickhouse/hbase...

CUSPARSE 第三章 CUSPARAE索引和数据格式

(纯属自学笔记,部分翻译,不会翻译的不翻译) 3.1 索引基本格式       该函数库支持 zero- and one-based 索引. The index base 是通过 cusparseIndexBase_t 选择, 且是一个独立参数,或者是矩阵形容器 cusparseMatDescr_t type的一部分 3.2 向量格式      略 3.3...

MySQL-快速入门(11)用户管理

1、权限表 存储用户权限信息表主要有:user、db、host、tables_priv、columns_priv、procs_priv。 1》user表: 记录允许连接到服务器的账号信息,里面的权限是全局级别的。user表有42个字段,这些字段可以分为4类,分别是用户列、权限列、安全列、资源控制列。 2》db和host表 3》tables_priv和col...

ubuntu apt 安装mysql 5.7

Ubuntu上安装MySQL非常简单只需要几条命令就可以完成。 1. sudo apt-get install mysql-server 2. apt-get isntall mysql-client 3. sudo apt-get install libmysqlclient-dev 安装过程中会提示设置密码什么的,注意设置了不要忘了,安装完成之后可以使...

MySQL的锁(1)

    锁机制是数据库系统区别于文件系统的一个关键特性,他可以确保用户能以一致的方式读取和修改数据。     为了保证一致性,必须有锁的介入。MySQL操作缓冲池中的LRU列表,删除、添加、移动LRU列表中的元素等地方也都适用锁,从而允许对多种不同资源的并发访问。     打个比方,我们到淘宝上买一件商品,商品只有一件库存,这个时候如果还有另一个人买,那么...

mycat的下载和安装

MySQL安装与启动 JDK:要求jdk必须是1.7及以上版本 MySQL:推荐mysql是5.5以上版本 MySQL安装与启动步骤如下:( 步骤1-5省略 ) (1)将MySQL的服务端和客户端安装包(RPM)上传到服务器   (2)查询之前是否安装过MySQL ? 1 rpm -qa|grep-i mysql (3)卸载旧版本MySQL...