淺談MySQL Online DDL (上)

本文首發於我的微信公衆號《andyqian》,期待你的關注!

前言

  這個知識點,不瞞你說,我也是最近才瞭解到的,以爲很是有用!就決定記錄在這裏,但願對你也有所幫助。mysql

索引建立

  若是你對DDL還不瞭解,能夠先看看上一篇文章《MySQL 命令種類》來回顧一下。咱們知道,在生產環境中作DDL操做成本是很是高的,爲何這樣說呢?咱們以(MySQL5.5以前版本)添加索引爲例,須要經歷的步驟有:sql

如上圖所示: 經歷步驟有:微信

  1. 按照原始表的定義,從新定義一個空的臨時表。併發

  2. 對臨時表進行添加索引。高併發

  3. 再將原始表中的數據逐條Copy到臨時表中。spa

  4. 當原始表中的全部記錄都被Copy臨時表後,將原始表進行刪除。插件

  5. 再將臨時表命名爲原始表表名。設計

從上面咱們能夠看出:索引建立一共經歷了五個步驟,才能加上索引,當數據量比較大時,光復制就須要大量的時間。在複製過程當中,還對原始表進行了寫鎖操做,致使 insert,delete,update 語句均不能執行。處於等待狀態。對於高併發應用來講,這是不容許的。也就致使在MySQL 5.5以前版本,線上添加,修改索引是一個極其痛苦的操做。3d

注意:(圖中括號內的關鍵字,並不表明MySQL內部採用該行爲,只是我爲了更容易理解,才添加。不要誤解。)code

快速索引建立

  快速索引建立原名爲:『 fast index creation 』,主要是由於在MySQL 5.5及更高版本(InnoDB插件的MySQL 5.1)上建立,刪除二級索引,不須要建立臨時表,複製數據等操做,提升了操做效率。其內部實現步驟爲:

  1. 發起刪除索引操做。

  2. 通知InnoDB系統表和MySQL數據字典表,該索引已標識爲失效狀態。

  3. 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(下)》繼續說,盡請期待!

 

相關閱讀:

寫會MySQL索引

讀懂MySQL執行計劃

MySQL表設計踩過的坑!

MySQL事務隔離級別

 

掃碼關注,一塊兒進步

我的博客: http://www.andyqian.com

相關文章
相關標籤/搜索