程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> MYSQL數據庫 >> MySQL綜合教程 >> MySQL中的alter table敕令的根本應用辦法及提速優化

MySQL中的alter table敕令的根本應用辦法及提速優化

編輯:MySQL綜合教程

MySQL中的alter table敕令的根本應用辦法及提速優化。本站提示廣大學習愛好者:(MySQL中的alter table敕令的根本應用辦法及提速優化)文章只能為提供參考,不一定能成為您想要的結果。以下是MySQL中的alter table敕令的根本應用辦法及提速優化正文


1、根本用法

1. 增長列

alter table tbl_name add col_name type

例如,  給pet的表增長一列 weight,

mysql>alter table pet add weight int;

2. 刪除列

alter table tbl_name drop col_name

例如, 刪除pet表中的weight這一列

mysql>alter table pet drop weight;

3. 轉變列

分為轉變列的屬性和轉變列的名字

轉變列的屬性——辦法1:

alter table tbl_name modify col_name type

例如,轉變weight的類型

mysql>alter table pet modify weight varchar(30);

轉變列的屬性——辦法2:

alter table tbl_name change old_col_name col_name type

例如,轉變weight的類型

alter table pet change weight weight varchar(30);

轉變列的名字:

alter table tbl_name change old_col_name col_name

例如轉變pet表中weight的名字:

mysql>alter table pet change weight wei;

4. 轉變表的名字

alter table tbl_name rename new_tbl

例如, 把pet表改名為animal

mysql>alter table pet rename animal;

2、對ALTER TABLE的優化
在體系的平常保護中,常常須要對表構造停止更新,例如添加/刪除一個字段,轉變一個VARCHAR的字段長度等等。MySQL針對這類修正表構造的處置方法是先創立一張新的構造的表,接著會經由過程履行Insert語句將舊表的內容拔出到新表中,最初刪除整張舊表。這類處置方法在數據量比擬小的時刻,不會有甚麼成績,可是當數據量很年夜的時刻能夠須要許多時光來處置該進程。
 
履行一個更新表構造的操作消費了幾個小時的時光,這是沒法忍耐的。假如你用的是5.1之前的版本的話,還會在履行表構造更新是數據庫常常是停滯辦事的,幸虧在最新的版本中這個成績獲得了改良
 
假如在停止表構造更新的時刻你采取了適當的辦法,也其實不是一切的更新操作會占用你良久的時光。
例如 你想更新用戶表的默許暗碼為“666666”,平日采取的做法是

mysql> ALTER TABLE user
      -> MODIFY COLUMN pwd VARCHAR NOT NULL DEFAULT ‘666666';

 
經由過程SHOW STATUS你可以發明在履行這個操作的進程中停止了年夜量的Insert操作,當用戶的數目很年夜時 例如百萬,萬萬條的數據時,必定會消費許多的時光。
 
可是假如你采取下邊的方法來更新的話,時光會年夜年夜的延長

mysql> ALTER TABLE user
     -> ALTER COLUMN pwd varchar 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 COLUMN
1.1   起首預備一張字典表

CREATETABLE IF NOT EXISTS dictionary (  
  id int(10) unsigned NOT NULLAUTO_INCREMENT,
  word varchar(100) NOT NULL,
  mean varchar(300) NOT NULL,
   PRIMARY KEY (`id`)
   );  

1.2    拔出一些測試數據

mysql>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

mysql> flush status;
Query OK, 0 rows affected (0.00 sec)
mysql> alter table dictionary
      ->modify column mean varchar(20) NOT null default 'DEFAULT1';
Query OK, 110002 rows affected (3.07 sec)
Records: 110002 Duplicates: 0 Warnings: 0
mysql> SHOW STATUS WHERE Variable_name LIKE'Handler%'
  ->OR Variable_name LIKE '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

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

2    修正frm文件
經由過程修正frm文件的方法來進步修正表構造效力的步調年夜概以下
1.       備份相干的數據庫文件
2.       創立一張和舊表完整雷同的表構造

mysql>create table dictionary_new like dictionary;

3.       履行FLUSH TABLES WITH READ LOCK. 一切的表都被封閉

mysql> alter table dictionary_new
     -> modify column mean varchar(30)default 'DEFAULR#';
mysql> flush table with read lock;

 
5.       把dictionary_new.frm文件重名為dictionary.frm
6.       履行UNLOCK TABLES

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

從上面的成果可以看出,默許值曾經被改失落,且不觸及到內容的轉變

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

 
7.        Drop dictionary_new

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved