`
丁林.tb
  • 浏览: 797216 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

MySQL5.5加主键锁读问题

阅读更多

 

背景

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

 

对照现象

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

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

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

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

 

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

----13的现象可以猜测出,实际上与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的改进就是基于这个判断。

2
3
分享到:
评论
5 楼 yanqingluo 2013-06-26  
谢谢分享。
4 楼 丁林.tb 2013-06-14  
huzi1986 写道
分析得不错,学习了

不过



删除主键流程 每3小项中的 MDL将写锁升级为读锁 是不是笔误了

应该是

MDL缉将读锁升级为写锁


确实是,已经更新了,多谢
3 楼 zhoujy 2013-06-14  
感谢分享 ,用metadata  lock 看来需要注意很多地方
2 楼 huzi1986 2013-06-13  
分析得不错,学习了

不过



删除主键流程 每3小项中的 MDL将写锁升级为读锁 是不是笔误了

应该是

MDL缉将读锁升级为写锁
1 楼 dodomail 2013-06-09  
非常不错,感谢,读完内容,感觉像甜点!

相关推荐

    mysql5.5从零开始学附加光盘!

    "mysql5.5.txt" 文件可能包含了教程、示例脚本或练习材料,这些资源将有助于加深你对 MySQL 5.5 的理解。在学习过程中,不断实践和探索,理论与实际相结合,你将能够快速掌握 MySQL 5.5 的核心技能。

    Mysql 5.5指导手册

    这个全面的MySQL 5.5中文指导手册,可以帮助读者深入理解数据库的运作机制,提高数据库管理技能,解决实际工作中遇到的问题。无论你是新手还是经验丰富的DBA,都能从中受益。同时,提供的"更多源码下载.url"可能指向...

    mysql5.5从零开始学完全完整版

    MySQL 5.5支持不同类型的索引,如唯一索引(UNIQUE)、主键索引(PRIMARY KEY)、普通索引(INDEX)、全文索引(FULLTEXT)和空间索引(SPATIAL)。 5. **视图**:视图是虚拟表,基于一个或多个表的查询结果。视图...

    mysql5.5从零开始学代码、数据库表

    综上所述,"mysql5.5从零开始学代码、数据库表"的学习内容涵盖了SQL语言基础、数据库表设计、数据关系、事务处理、并发控制、安全性、性能优化以及数据库管理等多个方面。通过深入学习并实践这些知识,你将能够熟练...

    MySQL5.5从零开始学.pdf

    MySQL5.5是该系列的一个重要版本,引入了许多新特性和性能优化,为开发者提供了更强大的功能和更好的可扩展性。以下是关于“MySQL5.5从零开始学.pdf”这本书中可能涵盖的一些关键知识点: 1. **MySQL基础概念**:...

    MYSQL+5.5从零开始学

    在MySQL 5.5中,有主键索引、唯一索引、普通索引、全文索引等多种类型。创建和管理索引包括CREATE INDEX、ALTER TABLE ADD INDEX和DROP INDEX。 六、查询语言 深入学习SQL查询语言,包括单表查询、多表联接(JOIN)...

    MySQL5.5版本.zip

    MySQL 5.5 版本是 MySQL 数据库管理系统的一个重要里程碑,它在 2010 年发布,带来了许多性能提升和新功能。MySQL 是一个开源的关系型数据库管理系统(RDBMS),广泛应用于网站开发、企业应用和数据存储。其主要特点...

    MySQL5.5中文手册PDF版

    在MySQL5.5中,你可以学习如何创建、修改和删除表,使用数据类型,以及定义约束(如主键、外键、唯一键)。此外,手册还会讲解索引的创建和管理,包括B-tree、全文索引和空间索引。 五、数据插入、查询与更新 手册...

    [MySQL5.5从零开始学].刘增杰等.扫描版.pdf

    不过,考虑到文件标题为“[MySQL5.5从零开始学].刘增杰等.扫描版.pdf”,我们可以推断这是一本关于MySQL数据库的学习资料。因此,我们可以从这个角度出发,围绕MySQL 5.5的特性、基础知识点以及学习资源进行介绍。 ...

    MySQL_5.5中文参考手册

    ### MySQL 5.5 中文参考手册核心知识点 #### 一、手册介绍与背景 - **手册来源**:本手册是 MySQL 5.5 的官方中文参考手册,由 MySQL 合作伙伴 GreatLinux 北京万里开源软件有限公司完成翻译工作。原始手册为英文...

    mysql5.5-5.6性能调优最优文档

    ### MySQL 5.5-5.6 性能调优详解 #### 一、初步优化思想 MySQL作为一款广泛使用的开源关系型数据库管理系统,在不同版本间进行性能调优时需考虑其特性变化与优化策略。从MySQL 5.5到5.6版本,InnoDB存储引擎得到了...

    MySQL_5.5参考手册(中文)

    - MySQL支持多种类型的约束,如主键、外键等,并且提供了灵活的约束处理机制。 ### 五、安装MySQL #### 2.1 一般安装问题 - **操作系统支持**:MySQL支持多种操作系统,包括Windows、Linux、macOS等。 - **分发版...

    jsp旅游网站设计eclipse+tomcat8.0+mysql5.5

    【标题】"jsp旅游网站设计eclipse+tomcat8.0+mysql5.5"是一个基于Java技术栈的旅游网站开发项目,它整合了Eclipse IDE、Tomcat 8.0应用服务器和MySQL 5.5数据库系统。这个项目旨在展示如何使用JSP(JavaServer Pages...

    mysql 从零开始学PPT

    【MySQL基础概念】 MySQL是一种关系型数据库管理系统,由瑞典MySQL AB公司开发,目前已被Oracle公司收购。它以SQL(Structured Query Language)作为主要查询语言,是互联网上最流行、使用最广泛的关系数据库之一,...

    毕业设计,房产销售管理系统,数据库版本当时使用mysql5.0,上传的sql文件在mysql5.5也可用.zip

    数据库版本提及的是“mysql5.0”,这是MySQL数据库的一个早期版本,具有良好的稳定性和性能,而“上传的sql文件在mysql5.5也可用”表明该系统的数据库脚本兼容性较好,可以在更新的MySQL 5.5版本上运行,这意味着...

    MySQL_5.5_Help(Chinese)

    MySQL 5.5 Help(Chinese) 是一份针对MySQL数据库管理系统5.5版本的中文参考手册。MySQL是一款广泛使用的开源关系型数据库系统,以其高效、稳定和易于管理的特点,在Web开发和企业级应用中占据重要地位。SQL...

    MySQL5中文参考手册

    - 事务隔离级别(读未提交、读已提交、可重复读、串行化)及其影响。 6. **视图与存储过程**: - 视图的创建与使用,如何简化复杂查询和保护数据。 - 存储过程的创建、调用和管理,以及其在数据库编程中的作用。...

    从MySQL 5.5迁移到Mariadb 10.1.14所遇到的问题

    在将MySQL 5.5迁移至MariaDB 10.1.14的过程中,可能会遇到一系列挑战和问题。以下是对这些挑战的详细说明以及可能的解决方案: 1. 表空间切换: MySQL 5.5默认情况下,InnoDB表的数据和索引存储在一个共享表空间...

Global site tag (gtag.js) - Google Analytics