這個知識點,不瞞你說,我也是最近才瞭解到的,以爲很是有用!就決定記錄在這裏,但願對你也有所幫助。mysql
若是你對DDL還不瞭解,能夠先看看上一篇文章《MySQL 命令種類》來回顧一下。咱們知道,在生產環境中作DDL操做成本是很是高的,爲何這樣說呢?咱們以(MySQL5.5以前版本)添加索引爲例,須要經歷的步驟有:sql
如上圖所示: 經歷步驟有:微信
按照原始表的定義,從新定義一個空的臨時表。併發
對臨時表進行添加索引。高併發
再將原始表中的數據逐條Copy到臨時表中。spa
當原始表中的全部記錄都被Copy臨時表後,將原始表進行刪除。插件
再將臨時表命名爲原始表表名。設計
從上面咱們能夠看出:索引建立一共經歷了五個步驟,才能加上索引,當數據量比較大時,光復制就須要大量的時間。在複製過程當中,還對原始表進行了寫鎖操做,致使 insert,delete,update 語句均不能執行。處於等待狀態。對於高併發應用來講,這是不容許的。也就致使在MySQL 5.5以前版本,線上添加,修改索引是一個極其痛苦的操做。3d
注意:(圖中括號內的關鍵字,並不表明MySQL內部採用該行爲,只是我爲了更容易理解,才添加。不要誤解。)code
快速索引建立原名爲:『 fast index creation 』,主要是由於在MySQL 5.5及更高版本(InnoDB插件的MySQL 5.1)上建立,刪除二級索引,不須要建立臨時表,複製數據等操做,提升了操做效率。其內部實現步驟爲:
發起刪除索引操做。
通知InnoDB系統表和MySQL數據字典表,該索引已標識爲失效狀態。
InnoDB將索引所佔空間回收至表空間中,以便後續索引,表記錄使用。
在這裏,咱們知道因爲二級索引只包含了索引鍵和主鍵值,因此在建立,刪除時不須要進行數據複製,從而不會進行鎖表。也就容許線上DML操做。不影響生產使用。
對於聚簇索引則不一樣,其包含了B樹節點中的數據值,因此,建立修改時,就涉及到了臨時表的建立,數據複製等,因此其成本也是很是高的。
上面提到了聚簇索引和二級索引,其實呀,仍是比較好理解的,下面分別介紹一下:
聚簇索引:
其實就是咱們常見的主鍵索引,是InnoDB存儲引擎中對主鍵索引的別名而已。表中記錄的存儲都是按照主鍵列進行有序組織的,主鍵索引的添加,刪除操做成本是很是高的。要通過: 建立臨時表,複製數據等一系列操做。
二級索引:
二級索引就是咱們常見字段上的索引,因爲二級索引的建立,刪除,不涉及建立臨時表,複製數據等操做,因此其修改爲本相對低不少。效率也更高!
以下所示:
alter table t_base_user add idx_name(name);
命令: show create table t_base_user;
做用: 顯示錶的建立語句。
例如:
mysql> show create table t_base_user \G *************************** 1. row *************************** Table: t_base_user Create Table: CREATE TABLE `t_base_user` ( `oid` bigint(20) NOT NULL AUTO_INCREMENT, `name` varchar(30) COLLATE utf8_unicode_ci DEFAULT NULL COMMENT 'name', `email` varchar(30) COLLATE utf8_unicode_ci DEFAULT NULL COMMENT 'email', `age` int(11) DEFAULT NULL COMMENT 'age', `telephone` varchar(30) COLLATE utf8_unicode_ci DEFAULT NULL COMMENT 'telephone', `status` tinyint(4) DEFAULT '0', `created_at` datetime DEFAULT NULL, `updated_at` datetime DEFAULT NULL, PRIMARY KEY (`oid`), UNIQUE KEY `idx_email` (`email`), KEY `idx_name` (`name`), KEY `idx_telephone` (`telephone`), KEY `idx_email_name` (`email`,`name`) COMMENT 'remark' ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci 1 row in set (0.00 sec)
從上面信息中,咱們不只能夠知道每列屬性(列名,字段長度,默認值,字符集),還能夠知道該表的索引信息,存儲引擎信息,字符集信息。是否是頗有幫助呢?
應用場景:咱們可使用該語句,來查看該表的建表信息,表的存儲引擎信息,在實際工做中,很是有用。
也許會有人說,這篇文章說的都是 Fast Index Creation (在線索引建立)和在線DDL有什麼關係?其實否則,在 MySQL 5.6 開始,Fast Index Creation (快速索引建立)已升級爲Online DDL了,開放了更多的在線DDL操做,咱們也再也不爲生產中執行DDL操做而犯愁了。不過,不是全部的DDL操做都支持在線操做的,咱們在下一篇文章《淺談MySQL Online DDL(下)》繼續說,盡請期待!
相關閱讀:
掃碼關注,一塊兒進步
我的博客: http://www.andyqian.com