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

MySQL5.5加主键锁读问题—续

阅读更多
背景

       上一篇说到MySQL 5.5加主键导致阻塞源表的读的问题。

有同学提到从调用函数看,在默认的old_alter_table=off的情况下,加主键过程没有看到copy to tmp table

         这里我们再细说一下。

 

说说fast index creation

         MySQL 5.1以后InnoDB引入了fast index creation。在有这个feature之前,MySQL认为所有的加减索引操作都必须创建临时表、拷贝数据、删除源表。

         有了这个神奇的功能之后,InnoDBMySQL说,稍等,要是加索引,不要你拷贝数据了,“放着我来”。怎么作的呢?

1)       扫描源表,将每行中用于索引的字段取出来

2)       排序构造新索引

3)       插入源表中

这个就是我们说的inplace-DDL了,大家看到,没有拷贝新表的操作。性能因此也提高了。这个过程叫做row_merge_build_indexes

 

再说说加主键

         对于InnoDB来说,数据也是以索引组织的,因此加主键,在概念上说,也是加索引。于是在old_alter_table=off的情况下,MySQL照着上面的约定,调用row_merge_build_indexes

         由于在5.5MySQL认为InnoDB还是inplace操作,因此锁策略就如同上一篇处理。

 

         那么InnoDB是不是在源表加主键呢?

         这显然不可能。

         Fast-index-creation的精髓是只需要读主键数据,生成新索引插入到源表中。若加的是主键,说明原来没有定义主键(多么正确的废话),这时候InnoDB是使用系统分配的row_id作为主键。当我们增加主键以后,不可能“构造主键,插入源表”----那样就俩主键了。。。

 

源码实现

         实际上row_merge_build_indexes有两个参数(old_table, new_table) 若新增的索引中不包含主键,则new_table == old_tablie,否则不等。

         对于不等的情况,这个过程就变成

1)       扫描old_table主键上的数据

2)       按照新增的索引插入到new_table

3)       而由于“主键”索引的叶子节点,实际上是包含所有数据,所以这个过程,其实就是copy table

 

对于new_table!=old_table的情况,在拷贝数据期间只需要加共享锁即可,只是5.5下没有意识到这个问题而已。

 

0
0
分享到:
评论
1 楼 jiahao_li 2013-06-14  
呵呵,苦逼的 【5.5下没有意识到这个问题而已】

相关推荐

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

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

    Mysql 5.5指导手册

    MySQL 5.5是MySQL数据库管理系统的一个重要版本,它在5.1的基础上进行了多项改进和增强,提供了更高效、更稳定的数据存储与管理能力。这个"MySQL 5.5指导手册"是一个详尽的参考资料,适合数据库管理员、开发人员以及...

    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中文参考手册

    MySQL5中文参考手册是一部详尽且实用的指南,专为数据库开发者和爱好者设计,尤其针对MySQL 5.1版本。这个版本的MySQL引入了许多新特性,优化了性能,并且提供了更多的功能来支持复杂的数据库操作。手册中包含了丰富...

    从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