MySQL表结构修改

mysql数据库里,对一个已创建的表进行DDL操作,比如说添加一个字段。在做测试时,发现ddl操作的时间特别的长。oracle里,通常情况下只是修改数据字典就可以了,操作时间非常的短,阻塞DML的时间也比较短。mysql数据库对表进行ddl操作跟oracle数据库有很大的不同,它先要把原表拷贝一份到临时表,这期间不阻塞select,阻塞所有的更改操作(update,delete,insert),对临时表ddl操作完成,删除原表,重命名临时表。

如果一张比较大的表进行ddl变更,比如说40G,那拷贝的时间让人无法忍受,并且阻塞所有的DML操作,让业务无法继续。

以下是测试过程:

mysql> desc t1;
+--------------+-------------+------+-----+---------+-------+
| Field    | Type    | Null | Key | Default | Extra |
+--------------+-------------+------+-----+---------+-------+
| id     | int(11)  | YES | MUL | NULL  |   |
| nick    | varchar(32) | YES |  | NULL  |   |
| email    | varchar(32) | YES |  | NULL  |   |
| gmt_create | datetime  | YES |  | NULL  |   |
| gmt_modified | datetime  | YES |  | NULL  |   |
+--------------+-------------+------+-----+---------+-------+
mysql> select count(*) from t1;
+----------+
| count(*) |
+----------+
| 2228017 |
+----------+
1 row in set (1.78 sec)

现在对它进行表结构变更,增加一列:

mysql> alter table t1 add(tel varchar(20));
Query OK, 2304923 rows affected (41.03 sec)
Records: 2304923 Duplicates: 0 Warnings: 0

在上述表结构变更过程中,启动另外一个会话,进行select查询操作和一个更新操作:

mysql> select count(*) from t1;
+----------+
| count(*) |
+----------+
| 2304923 |
+----------+
1 row in set (2.10 sec)
mysql> select * from t1 limit 10;
+------+-------+------------------+---------------------+---------------------+
| id  | nick | email      | gmt_create     | gmt_modified    |
+------+-------+------------------+---------------------+---------------------+
|  0 | nick0 | nick0@taobao.com | 2008-03-14 00:00:00 | 2008-03-14 00:00:00 |
|  1 | nick1 | nick1@taobao.com | 2008-03-14 00:00:00 | 2008-03-14 00:00:00 |
|  2 | nick2 | nick2@taobao.com | 2008-03-14 00:00:00 | 2008-03-14 00:00:00 |
|  3 | nick3 | nick3@taobao.com | 2008-03-14 00:00:00 | 2008-03-14 00:00:00 |
|  4 | nick4 | nick4@taobao.com | 2008-03-14 00:00:00 | 2008-03-14 00:00:00 |
|  5 | nick5 | nick5@taobao.com | 2008-03-14 00:00:00 | 2008-03-14 00:00:00 |
|  6 | nick6 | nick6@taobao.com | 2008-03-14 00:00:00 | 2008-03-14 00:00:00 |
|  7 | nick7 | nick7@taobao.com | 2008-03-14 00:00:00 | 2008-03-14 00:00:00 |
|  8 | nick8 | nick8@taobao.com | 2008-03-14 00:00:00 | 2008-03-14 00:00:00 |
|  9 | nick9 | nick9@taobao.com | 2008-03-14 00:00:00 | 2008-03-14 00:00:00 |
+------+-------+------------------+---------------------+---------------------+
10 rows in set (0.00 sec)
mysql> update t1 set nick='test_nick' where id=1;
Query OK, 4 rows affected (43.89 sec)     --这里是阻塞的时间
Rows matched: 4 Changed: 4 Warnings: 0

通过以上实验可以看出,对表进行ddl操作时,mysql并不阻塞select查询,但会严重阻塞dml操作。另外,如果你要对表进行ddl操作,由于有一个拷贝操作,你要计算好你的可用空间够不够?如果你的系统经常要进行表结构变更,那么你将不得不要考虑此问题!

时间: 2024-11-05 18:45:41

MySQL表结构修改的相关文章

php列出mysql表所有行和列的方法

 这篇文章主要介绍了php列出mysql表所有行和列的方法,涉及php操作mysql数据库的技巧,具有一定参考借鉴价值,需要的朋友可以参考下     本文实例讲述了php列出mysql表所有行和列的方法.分享给大家供大家参考.具体实现方法如下: 代码如下: <html> <head> <title>Selecting Data</title> </head> <body> <?php $user = "root&quo

mysql 检测 脚本-mysql 表检及自动修复测脚本

问题描述 mysql 表检及自动修复测脚本 我想写一个bat脚本,来检测哪些表损坏了,并能根据检测到的结果对损坏的表进行自动关机修复.用mysqlcheck不行,我的存储引擎是innoDB

mysql 修改表引擎:php批量转换mysql表引擎

有些时候可能需要批量转换mysql表的引擎,如下为php操作实现<?php/*** 批量转换mysql表引擎*/error_reporting(e_all);// 数据库连接配置$host = 'localhost';$username = 'root';$passwd = '';$database = 'test';// 要转换的库名配置,多库转换增加配置元素即可$configs = array($database);// 转换配置$convert_rule = array('from' =>

MySQL表结构的同步

现在全身心投入到MySQL中. 项目要求:将开发环境中的数据库的修改同步至线上环境. 开发者给出的解决办法是:利用像Python 中的South框架,自动将开发环境的变更同步至生产环境.这个对于DBA来说是无法承受的(除非是创建数据库结果类似的语句).数据库变更在生产环境执行,必须事先经过评估.对业务的影响降到最低,这个就设计到了重新设计索引,或者采用在线修改工具之类的.本文暂时先不讨论,下面给出表同步的解决办法. 以前的做法是通过navicate的工具将一个一个的数据库进行对比或者自己写脚本M

教你实现MySQL表数据迁移自动化

一.背景 之前我写过关于SQL Server的数据迁移自动化的文章:SQL Server 数据库迁移偏方,在上篇文章中设计了一张临时表,这个临时表记录搬迁的配置信息,用一个存储过程读取这张表进行数据的迁移,再由一个Job进行迭代调用这个存储过程. 在这次MySQL的实战中,我的数据库已经做了4个分片,分布在不同的4台机器上,每台机器上的数据量有1.7亿(1.7*4=6.8亿),占用空间260G(260*4=1040G),这次迁移的目的就是删除掉一些历史记录,减轻数据库压力,有人说这为什么不使用表

修复mysql表错误

普通修复 mysql> repair table cab_data; +---------------------+--------+----------+------------------------------------------------------------------------+ | Table | Op | Msg_type | Msg_text | +---------------------+--------+----------+------------------

Win7系统如何使用CMD命令导出MySQL表数据

  Win7系统如何使用CMD命令导出MySQL表数据         操作方法: 1.打开始菜单中运行命令提示符: 2.然后输入命令: 假设导出tomtopportal数据库下的t_article_base表数据到E:/xitongcheng.com.txt文件.执行命令如下: mysqldump -h localhost -u root -p tomtopportal t_article_base >e:xitongcheng.com.txt 3.命令行指示输入mysql的root用户密码(

从管理员角度分析:MySQL表引擎中MyISAM和InnoDB的对比

原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://dgd2010.blog.51cto.com/1539422/1403785 题记:有些问题只是常识,只是在某些情景下"心急"的管理员可能会忽略这些常识,当然了这也是很多人都会犯的错误.谨以此文记录这件刚才发生的囧事. 常用的MySQL表引擎有不少,但最常用的就是MyISAM和InnoDB,这两者的区别有很多网站上都有很好的文章去介绍,再此仅列出URL就不再赘述. My

基于Solr DIH实现MySQL表数据全量索引和增量索引

实现MySQL表数据全量索引和增量索引,基于Solr DIH组件实现起来比较简单,只需要重复使用Solr的DIH(Data Import Handler)组件,对data-config.xml进行简单的修改即可.Solr DIH组件的实现类为org.apache.solr.handler.dataimport.DataImportHandler,在Solr的solrconfig.xml中配置两个handler,配置分别说明如下. 全量索引 solrconfig.xml配置如下: 1 <reque