mysql alter table if_MySQL中的alter table命令的基本使用方法及提速优化

一、基本用法

1. 增加列

?1alter table tbl_nameadd col_name type

例如,  给pet的表增加一列 weight,

?1mysql>alter table petadd weightint;

2. 删除列

?1alter table tbl_namedrop col_name

例如, 删除pet表中的weight这一列

?1mysql>alter table petdrop weight;

3. 改变列

分为改变列的属性和改变列的名字

改变列的属性——方法1:

?1alter table tbl_namemodify col_name type

例如,改变weight的类型

?1mysql>alter table petmodify weightvarchar(30);

改变列的属性——方法2:

?1alter table tbl_name change old_col_name col_name type

例如,改变weight的类型

?1alter table pet change weight weightvarchar(30);

改变列的名字:

?1alter table tbl_name change old_col_name col_name

例如改变pet表中weight的名字:

?1mysql>alter table pet change weight wei;

4. 改变表的名字

?1alter table tbl_name rename new_tbl

例如, 把pet表更名为animal

?1mysql>alter table pet rename animal;

二、对ALTER TABLE的优化在系统的日常维护中,经常需要对表结构进行更新,例如添加/删除一个字段,改变一个VARCHAR的字段长度等等。MySQL针对这种修改表结构的处理方式是先创建一张新的结构的表,接着会通过执行Insert语句将旧表的内容插入到新表中,最后删除整张旧表。这种处理方式在数据量比较小的时候,不会有什么问题,可是当数据量很大的时候可能需要很多时间来处理该过程。

执行一个更新表结构的操作花费了几个小时的时间,这是无法忍受的。如果你用的是5.1之前的版本的话,还会在执行表结构更新是数据库往往是停止服务的,幸好在最新的版本中这个问题得到了改善

如果在进行表结构更新的时候你采用了恰当的方法,也并不是所有的更新操作会占用你很久的时间。

例如 你想更新用户表的默认密码为“666666”,通常采用的做法是

?12mysql>ALTER TABLE user->MODIFY COLUMN pwdVARCHAR NOT NULL DEFAULT ‘666666';

通过SHOW STATUS你可以发现在执行这个操作的过程中进行了大量的Insert操作,当用户的数量很大时 例如百万,千万条的数据时,必然会消耗很多的时间。

可是如果你采用下边的方式来更新的话,时间会大大的缩短

?12mysql>ALTER TABLE user->ALTER COLUMN pwdvarchar not null SETDEFAULT 5;

执行SHOW STATUS操作发现大量的插入操作不存在了,且时间也大大的缩短了(需要先进行FLUSH STATUS)

之所以可能缩短时间是因为

(1)表字段的默认值是放在表的frm(.frm:表结构文件  .MYD:表数据文件  .MYI:表索引)文件中

(2)ALTER COLUMN会更新frm文件,而不会涉及到表的内容

(3)MODIFY COLUMN会涉及到表数据的内容

从前面的列子可以看出如果操作的过程中只涉及到frm文件的改动的话,表结构的更新效率会大大的提高,但是很多时候在没有必要的时候mysql也会进行表的重建。如果你愿意承担风险,可以用修改frm文件的方式以达到提速修改表结的目的

并不是所有的表结构改动都可以通过修改frm文件的方式来提高修改的效率,下面的一些改动可以通过修改frm文件的方式达到更新的目的:

(1)      更改字段的默认值

(2)      增加/删除字段的AUTO_INCREMENT属性

(3)      增加/删除/修改 ENUM的常量值。对于删除操作,如果有字段引用了这个常量值,则在删除后查询的结构为空字符串

下面以更新字段的默认值属性为例,分别通过使用ALTER COLUMN和修改frm文件的方式来提高修改表结构的效率

1 执行ALTER COLUMN1.1   首先准备一张字典表

?123456CREATETABLE IFNOT EXISTS dictionary (idint(10) unsignedNOT NULLAUTO_INCREMENT,wordvarchar(100)NOT NULL,meanvarchar(300)NOT NULL,PRIMARY KEY (`id`));

1.2    插入一些测试数据

?123mysql>DELIMITER $$mysql>DROP PROCEDURE IF EXISTS SampleProc$$Query OK, 0rows affected, 1 warning (0.01 sec)
CREATEPROCEDURE SampleProc()
BEGIN
DECLARE xINT;
SET x = 1;
WHILEx  <= 110000 DO
insert intodictionary (word, mean)values(concat('a',x),concat('a means',x));
SET  x = x + 1;
END WHILE;
END
mysql>    DELIMITER ;
mysql>call SampleProc();

1.3    SHOW STATUS 观察结果Modify Column 以及Alter Column的区别

首先使用MODIFY COLUMN

?123456789101112131415161718mysql> flush status;Query OK, 0rows affected (0.00 sec)mysql>alter table dictionary->modify column meanvarchar(20)NOT null default 'DEFAULT1';Query OK, 110002rows affected (3.07 sec)Records: 110002 Duplicates: 0 Warnings: 0mysql> SHOW STATUSWHERE Variable_nameLIKE'Handler%'->OR Variable_nameLIKE 'Created%';+----------------------------+--------+| Variable_name       | Value |+----------------------------+--------+| Handler_read_rnd_next   | 110003 || Handler_rollback      | 0   || Handler_savepoint     | 0   || Handler_savepoint_rollback | 0   || Handler_update       | 0   || Handler_write       | 110002 |+----------------------------+--------+

在使用ALTER COLUMN

?1234567891011121314mysql> flush status;mysql>alter table dictionary->alter column meanset default'DEFAULT2';Query OK, 0 rowsaffected (0.03 sec)Records: 0 Duplicates: 0 Warnings: 0mysql> SHOW STATUSWHERE Variable_nameLIKE 'Handler%'->OR Variable_nameLIKE 'Created%';+----------------------------+-------+| Variable_name       | Value |+----------------------------+-------+|Handler_read_rnd_next   | 0   ||Handler_savepoint_rollback | 0   || Handler_update       | 0   || Handler_write       | 0   |

2    修改frm文件通过修改frm文件的方式来提高修改表结构效率的步骤大概如下

1.       备份相关的数据库文件

2.       创建一张和旧表完全相同的表结构

?1mysql>create table dictionary_newlike dictionary;

3.       执行FLUSH TABLES WITH READ LOCK. 所有的表都被关闭

?123mysql>alter table dictionary_new->modify column meanvarchar(30)default 'DEFAULR#';mysql> flushtable with read lock;

5.       把dictionary_new.frm文件重名为dictionary.frm

6.       执行UNLOCK TABLES

?123mysql> unlock tables;mysql>insert into dictionary(word)values('Random');mysql>select *from dictionarywhere word='Random';

从下面的结果可以看出,默认值已经被改掉,且不涉及到内容的改变

?12345+--------+--------+----------+| id   | word | mean   |+--------+--------+----------+| 110004 |Random | DEFAULR# |+--------+--------+----------+

7.        Drop dictionary_new

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/443612.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

mysql_real_escape_string 报错_addslashes与mysql_real_escape_string的区别

addslashes和mysql_real_escape_string.都是为了使数据安全的插入到数据库中而进行过滤.那么这两个函数到底是有什么区别呢??我们今天来简单的看下..首先.我们还是从PHP手册入手..手册上addslashes转义的字符是单引号()、双引号(")、反斜线(\)与NUL(NULL 字符)。mysql_r…

shell执行perl_【编程技巧(一)】在Perl、Shell和Python中传参与输出帮助文档

社会你明哥&#xff0c;人狠话又多&#xff01;【小明的碎碎念】与你不见不散&#xff01;作为一名搞数据的生物狗&#xff0c;咱们是生物狗中代码写得最六的&#xff0c;程序员中生物学得最好的——大家没意见吧&#xff0c;有意见请憋着跟随小明的步伐&#xff0c;让我们开开…

项目开发中的编码规范

1.规范存在的意义&#xff1a; 好的编码规范可以尽可能的减少一个软件的维护成本 , 并且几乎没有任何一个软件&#xff0c;在其整个生命周期中&#xff0c;均由最初的开发人员来维护&#xff1b; 好的编码规范可以改善软件的可读性&#xff0c;可以让开发人员尽快而彻底地理解…

mysql 5.6.36安装图解_2017年12月聚合文章--实战-Mysql5.6.36脚本编译安装及初始化 | 码友网...

概述本文为centos7.3自动化编译安装mysql5.3.6的脚本及后续初始化操作&#xff0c;话不多少&#xff0c;直接上脚本。安装脚本install.py如下&#xff1a;#codingutf-8#!/usr/bin/pythonimport os,commands#定义变量install_dir /data/mysqldata_dir /data/mysql/datapackage…

python之路2.0_Python之路【第二十一篇】:JS基础

1.2 ECMAScript尽管 ECMAScript 是一个重要的标准&#xff0c;但它并不是 JavaScript 唯一的部分&#xff0c;当然&#xff0c;也不是唯一被标准化的部分。实际上&#xff0c;一个完整的 JavaScript 实现是由以下 3 个不同部分组成的&#xff1a;● 核心(ECMAScript)● 文档对象…

solr4 mysql自动更新_(solr系列:五) solr定时实时重建索引和增量更新

将mysql中的数据导入到了solr中之后&#xff0c;如果数据库中的数据有变动&#xff0c;solr中还是第一次导入的旧的数据&#xff0c;那该如何是好呢&#xff1f;该如何实现mysql数据库中的数据定时同步到solr中呢&#xff1f;下面将做详细的介绍。准备工作要做好&#xff1a;1、…

mysql pydev_pydev-python 链接mysql数据库(mac系统)

在mac os上安装MySQLdb&#xff0c;遇到了非常多问题&#xff0c;总结一下&#xff1a;首先。假设用sudo easy_install mysql-python命令安装&#xff0c;基本上不会成功的&#xff0c;原因有两个&#xff1a;一是找不到mysql_config位置&#xff0c;二是如今基本上安装的是64位…

MySQL多个线程同时写数据_多个线程可以同时将数据写入文件吗?

同步声明可以做到这一点。尝试下面的代码&#xff0c;我在类似的情况下使用。package hrblib;import java.io.*;public class FileOp {static int nStatsCount 0;static public String getContents(String sFileName) {try {BufferedReader oReader new BufferedReader(new F…

Java在Linux下创建文件,文件夹,删除,拷贝文件的命令

1.创建&#xff0c;删除文件夹,复制文件夹 mkdir,rmdir如:mkdir -p dir1/dir2 //-p表示递归创建文件夹 cp -r /tmp/a /root/a //拷贝不强制覆盖cp -rf /tmp/a /root/a //拷贝强制覆盖 2.创建&#xff0c;删除文件 vi&#xff0c;touch都可以创建文件。如:vi fileNametouch f…

python 拼多多_拼多多现重大BUG被“薅羊毛”,教你如何用Python简单褥羊毛

import timefrom urllib.parse import parse_qsimport requestsfrom bs4 import BeautifulSoupfrom selenium import webdriverfrom selenium.common.exceptions import *from selenium.webdriver.support.wait import WebDriverWait# 额外抽取的授权模块from utils import aut…

上海交通大学python期末考试样题加解析_上海交通大学python期末考试样题加解析...

一、选择题: 将唯一正确的选项写在题前括号中.每题2分.【】(1) 本课程的目标定位是什么?[A] 学习Python语言[B] 学习计算机的工作原理[C] 学习各种算法[D] 学习用计算机解决问题【】(2) 下列哪个标识符是合法的?[A] var-name [B] !#$% [C] _100 [D] elif【】(3) 执行下列语句…

mysql 安装测试ok_tpcc-mysql安装测试与使用的实例教程

1&#xff1a;下载tpcc-mysql的压缩包&#xff0c;从下面的网站进行下载也可直接从叶总博客直接下载&#xff1a;我这边使用的就是后者。2&#xff1a;安装tpcc-mysql[rootmxqmongodb2 tpccmysql]# gunzip tpcc-mysql-src.tgz[rootmxqmongodb2 tpccmysql]# tar xf tpcc-mysql-s…

python多线程写同一文件_Python多线程写文件实例

# -*- coding: utf-8 -*-import threading多线程生成日志工具__author ["yangfei" ]#该方法主要用于写入300行WARN日志def writeWarnLog(file):count0;while count<300:try:file.write(2012-11-28 22:51:01|zookeeper|WARN|m1|172.17.1.15\n)count1except Except…

Tomcat6.0.37,tomcat6.0.37,下访问Web项目,jsp项目不需要输入项目名称和端口号的配置方法...

1.不需要数据项目名称就可以访问项目的配置方法如下&#xff1a; 首先到你的Tomcat下的conf文件夹下找到server.xml文件&#xff0c;打开后修改为&#xff1a; <Host name"localhost" appBase"webapps"unpackWARs"true" autoDeploy"tru…

java合并list_java合并list方法代码实例

这篇文章主要介绍了java合并list方法代码实例,文中通过示例代码介绍的非常详细&#xff0c;对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下List包括List接口以及List接口的所有实现类。因为List接口实现了Collection接口&#xff0c;所以List接口拥有Collec…

java math 函数_Java中Math类常用函数总结

Java中比较常用的几个数学公式的总结&#xff1a;//取整&#xff0c;返回小于目标函数的最大整数,如下将会返回-2Math.floor(-1.8)&#xff1b;//取整&#xff0c;返回发育目标数的最小整数Math.ceil()//四舍五入取整Math.round()//计算平方根Math.sqrt()//计算立方根Math.cbrt…

java asc码_Java中ASC码与字符互相转化

package com.ljq.test;/*** Java中ASC码与字符互相转化** author jiqinlin**/public class ASCTest {private static int ascNum;private static char strChar;public static void main(String[] args) {System.out.println(getAsc("a"));System.out.println(backcha…

java上传png_java上传png图片出现红色背景

java图片上传出现红色背景java图片服务器上传图片都很正常&#xff0c;唯独上传png图片时&#xff0c;png图片变成红色背景原因是读取上传数据时用的是ImageIO.read(inputstream)方法public static BufferedImage getImages(byte[] data) throws IOException {ByteArrayInputSt…

java 引用队列_Java中管理资源的引用队列相关原理解析

当对象改变其可达性状态时&#xff0c;对该对象的引用就可能会被置于引用队列(reference queue)中。这些队列被垃圾回收器用来与我们的代码沟通有关对象可达性变化的情况。这些队列是探测可达性变化的最佳方式&#xff0c;尽管我们也可以通过检查get方法的返回值是不是null来探…

Tomcat 替换项目图标

1.首先制作一个32*32像素的图标&#xff0c;命名为favicon.ico这里名称必须是和Tomcat的webapps下的ROOT下的一样。 2.把制作好的图标放到你要部署的Web项目的images目录下&#xff0c;如果你的Web项目有过滤器等&#xff0c;要给后缀名为.ico的图标放行。 3.最后你就可以在你需…