【来自:http://dinglin.iteye.com/blog/1884696】
背景

     有同学讨论到MySQL 5.5下给大表加主键时会锁住读的问题,怀疑与fast index creation有关,这里简单说明下。

对照现象

         为了说明这个问题的原因,有兴趣的同学可以做对比实验。

1)  在给InnoDB表创建主键期间,会锁住该表上的读数据

2) 但是同样的表执行删除主键期间,不会锁住该表上的读操作

----这说明与是否fast index creation无关,因为这两个操作在数据层面的行为应该是类似的,实际上,创建/删除主键都必须copy data。

3) 在创建主键期间,会锁住该表上执行的show create table

----用1、3的现象可以猜测出,实际上与meta data lock有关。

关于meta data lock(MDL)

         MySQL 5.5中引入了MDL,当需要访问、修改表结构时,都需要对meta data加锁(读或写)。比如,当一个线程需要修改表结构的任意一部分时,此时需要阻塞对表结构的访问,当然也需要阻塞对数据行的访问。

加主键流程

         当对一个表作加主键操作时,大致流程如下

1) MDL加写锁

2) 操作数据,最耗时部分,注意需要copy data,因此流程上是

a)创建一个临时表A,表A定义为修改后的表结构

b)从原表读取数据插入表A

c)删除原表,将表A重命名为原表名

3)  MDL释放写锁

从这个流程可以看到,在最耗时的部分,meta data是被一个X锁保护的。因此在此期间,show create table 或者select data都是会被阻塞。

这解释了上面的1) 3)。

删除主键流程

1)  MDL加读锁

2)  操作数据,最耗时部分

a) 创建一个临时表A,表A定义为修改后的表结构

b) 从原表读取数据插入表A

3) MDL将读锁升级为写锁

c) 删除原表,将表A重命名为原表名

4)  MDL释放写锁

这个在最耗时的数据操作部分,加的是MDL的读锁,这样不会影响访问原表的表结构或数据(当然要做更新是不行的)。而最后升级为写锁的时间,只是做重命名表的操作,阻塞的时间就很短。

结论

1) 显然第二个流程更合理

2) 这个可以认为是MySQL一个可改进的点,并且在5.6下已经改进

3) 这个问题与是copy data还是inplace方式执行DDL无关,实际上由于InnoDB的聚集索引组织结构,增、删主键都是必须得copy data的。

==========更新====

有同学问说为什么在5.5 set old_alter_table=on;之后是不会阻塞读的? 因为打开old_alter_table之后,MySQL认为这次无论如何是要copy data的,所以锁用的是“删除主键流程”的策略。

实际上无论old_alter_table是否打开,对主键操作都是必须copy data的,5.6的改进就是基于这个判断。

更多的Metadata lock 信息 请见:http://www.cnblogs.com/zuoxingyu/archive/2013/03/15/2960862.html

转载于:https://www.cnblogs.com/zhoujinyi/archive/2013/06/14/3135122.html

MySQL5.5加主键锁读问题【转】相关推荐

  1. MySQL5.5加主键锁读问题

    背景 有同学讨论到MySQL 5.5下给大表加主键时会锁住读的问题,怀疑与fast index creation有关,这里简单说明下. 对照现象 为了说明这个问题的原因,有兴趣的同学可以做对比实验. ...

  2. 数据库加主键sql_SQL数据库设计:选择主键

    数据库加主键sql There are a couple of rules to follow when choosing a primary key for a table: all records ...

  3. Asp.net 用DataSet对象更新数据(SqlDataAdapter) DataTable加主键

      私の青い色スペース 专注于.NET,认真把握好生命的每一秒,让每天都过的有意义..!     常用链接 我的随笔 我的评论 我参与的随笔 留言簿(1) 给我留言 查看公开留言 查看私人留言 我参与 ...

  4. Oracle-No.04 Oracle视图加主键解决hibernate复合主键问题

    2019独角兽企业重金招聘Python工程师标准>>> Oracle视图默认是没有主键的,因此在用hibernate反向生成java类时,会自动采用复合主键,多生成一个类名+ID的类 ...

  5. mysql主键更新被锁_MySQL 的加锁处理,你都了解的一清二楚了吗?

    MySQL加锁分析,一直是一个比较困难的话题. 我在工作过程中,经常会有同事咨询这方面的问题.本文,准备就MySQL加锁问题,展开较为深入的分析与讨论,主要是介绍一种思路,运用此思路,拿到任何一条SQ ...

  6. mysql 联合主键 加锁_MySQL 加锁处理分析

    背景 MySQL/InnoDB的加锁分析,一直是一个比较困难的话题.我在工作过程中,经常会有同事咨询这方面的问题.同时,微博上也经常会收到MySQL锁相关的私信,让我帮助解决一些死锁的问题.本文,准备 ...

  7. MySQL怎么运行的系列(十)Innodb中的锁:记录锁、临键锁、间隙锁、意向锁

    本系列文章目录 展开/收起 MySQL怎么运行的系列(一)mysql体系结构和存储引擎 MySQL怎么运行的系列(二)Innodb缓冲池 buffer pool 和 改良版LRU算法 Mysql怎么运 ...

  8. 【Java面试题】6年开发去A里面试P6竟被Mysql难住了,说一下你对行锁、临键锁、间隙锁的理解

    一个工作了6年的程序员,最近去阿里面试p6这个岗位. 面试之前信心满满的和我说,这次一定要拿下 35k月薪的offer. 然后,在第一面的时候,被Mysql里面的一个问题难住了. 大家好,我是Mic, ...

  9. 大话:行锁 间隙锁 表锁 临键锁

    行锁 临键锁 间隙锁都是mysql里面innoDB引擎下去解决事务隔离性的一系列排他锁. 目录 行锁 ​编辑 间隙锁 表锁 临键锁 行锁 对主键或唯一索引加锁时候,mysql默认会对这一行数据默认加行 ...

最新文章

  1. 机器学习入门(08)— 损失函数作用和分类(均方误差、交叉熵误差)
  2. 一直都想总结一下自己遇到过的web安全方面的问题--2015-03-31
  3. 使用final关键字修饰一个变量时,是引用不能变,还是引用的对象不能变?
  4. (转载)NSOperation and NSOperationQueue教程(翻译)
  5. 16个让你烧脑让你晕的悖论
  6. mllib协同过滤 java实现_协同过滤(ALS)算法介绍及Spark MLlib调用实例(Scala/Java/Python)...
  7. ctags的如何生成tags文件
  8. Spring和ThreadLocal
  9. 哨兵2号(Sentinel-2)介绍、下载、预处理及批处理
  10. Java程序调用OpenDDS
  11. 在线word预览方案
  12. SPSS软件做方差分析
  13. win10开始菜单 此计算机,如何将win10电脑中的开始菜单设置成智能版
  14. BUUCTF MISC入门
  15. u8转完看不到菜单_用友U8软件菜单和导航有功能不能正常显示,如何解决?
  16. cass生成里程文件桩号不全_怎样用CASS生成里程文件,带桩号的
  17. html5教程渐变效果,科技常识:html5教程实现Photoshop渐变色效果
  18. 以一举三的京东数据爬取(已经分配好各个方法,修改几行代码即可应用其他网站)并以json文件保存
  19. VBA入门到进阶常用知识代码总结43
  20. Corral the Cows赶牛入圈(二维离散化)

热门文章

  1. 为什么学习C语言这么久,看的懂代码,做不出题,写不出来项目?
  2. java 文件封装_Java 封装
  3. 计算机网络技术教法改革方案,计算机网络技术专业教学模式改革探索
  4. 如何取消计算机阻止安装程序,Win10电脑安装软件提示“你必须取消阻止该发布者才能运行此软件”怎么办...
  5. java反向映射_opencv 直方图和直方图反向映射
  6. python docx库使用样例_Python docx库用法示例分析
  7. 什么是节点光端机?总线型光端机有哪些优势?
  8. 工业交换机的四种安装方式图解
  9. [渝粤教育] 西北工业大学 机械原理 参考 资料
  10. java 80_【JavaWeb】80:js基础详解