【MySQL】5.7新特性之三

haoge0205發表於2016-11-22
寫在前面
  本系列文章基於5.7.12 版本講述MySQL的新特性,從安裝,檔案結構,SQL ,最佳化 ,運維層面 複製,等幾個方面展開介紹5.7 的新特性和功能,同時也建議大家跟蹤官方blog和 文件 ,以儘快知悉其新的變化。 本文著重介紹5.7版本的innodb 相關的新特性。看了文件,只能使用目不暇接來形容5.7帶來的新變化,廢話不多說,進入正題--Innodb 功能增強。 
3.1 動態修改varchar 長度大小。
  可以可以透過ALTER TABLE 語句以in place方式修改varchar的大小且無需table-copy。但存在限制:表示varchar 長度的位元組數不能變化(如果變更前使用1個位元組表示長度,變更後也必須使用1個位元組表示),即只支援0~255內的或者255以上的範圍變更(增大),如果欄位的長度從254增到256時就不能使用in-place演算法,必須使用copy演算法,否側報錯.需要注意的是 減小 varchar(N)長度的大小必須使用copy型別,如:
  1. mysql> alter table yy change column name name varchar(256) ,algorithm=inplace;
  2. ERROR 1846 (0A000): ALGORITHM=INPLACE is not supported. Reason: Cannot change column type INPLACE. Try ALGORITHM=COPY.
  3. mysql> alter table yy change column name name varchar(255) ,algorithm=inplace;
  4. Query OK, 0 rows affected (0.05 sec)
  5. Records: 0 Duplicates: 0 Warnings: 0
  6. mysql> alter table yy change column name name varchar(256) ,algorithm=copy;
  7. Query OK, 1 row affected (0.10 sec)
  8. Records: 1 Duplicates: 0 Warnings: 0
  9. mysql> alter table yy change column name name varchar(100) ,algorithm=inplace;
  10. ERROR 1846 (0A000): ALGORITHM=INPLACE is not supported. Reason: Cannot change column type INPLACE. Try ALGORITHM=COPY.
3.2 臨時表效能最佳化 
MySQL 5.7對臨時表做了極大的改動,提升效能。
透過最佳化 CREATE TABLE, DROP TABLE, TRUNCATE TABLE,和ALTER TABLE 語句的執行邏輯,提升臨時表的效能。(這個是從官網翻譯的,還沒找到除了alter之外的其他資料說明詳細的最佳化過程)
InnoDB臨時表後設資料不再儲存於InnoDB系統表而是儲存在INNODB_TEMP_TABLE_INFO,包含所有使用者和系統建立的臨時表資訊。該表在第一次在其上執行select時被建立。

  1. mysql> desc information_schema.INNODB_TEMP_TABLE_INFO;
  2. +----------------------+---------------------+------+-----+---------+-------+
  3. | Field                | Type                | Null | Key | Default | Extra |
  4. +----------------------+---------------------+------+-----+---------+-------+
  5. | TABLE_ID             | bigint(21) unsigned | NO   |     | 0       |       |
  6. | NAME                 | varchar(202)        | YES      | NULL    |       |
  7. | N_COLS               | int(11) unsigned    | NO   |     | 0       |       |
  8. | SPACE                | int(11) unsigned    | NO   |     | 0       |       |
  9. | PER_TABLE_TABLESPACE | varchar(64)         | YES  |     | NULL    |       |
  10. | IS_COMPRESSED        | varchar(64)         | YES  |     | NULL    |       |
  11. +----------------------+---------------------+------+-----+---------+-------+
  12. 6 rows in set (0.00 sec)
3.3 新增臨時表空間 
 為所有 非壓縮的innodb臨時表提供一個獨立的表空間,預設的臨時表空間檔案為ibtmp1,位於資料目錄。我們可透過innodb_temp_data_file_path引數指定臨時表空間的路徑和大小。

  1. mysql> show global variables like 'innodb_temp_data_file_path';
  2. +----------------------------+-----------------------+
  3. | Variable_name              | Value                 |
  4. +----------------------------+-----------------------+
  5. | innodb_temp_data_file_path | ibtmp1:12M:autoextend |
  6. +----------------------------+-----------------------+
  7. 1 row in set (0.00 sec)
MySQL每次重新啟動時,會重新建立臨時表空間。
注意 從5.7.5開始,新增一個系統選項 internal_tmp_disk_storage_engine 可定義磁碟臨時表的引擎型別為 InnoDB,而在這以前,只能使用 MyISAM。而在5.6.3以後新增的引數default_tmp_storage_engine是控制create temporary table建立的臨時表的儲存引擎,在以前預設是MEMORY,不要把這二者混淆了。

  1. mysql> show global variables like '%storage_engine%';
  2. +----------------------------------+--------+
  3. | Variable_name                    | Value |
  4. +----------------------------------+--------+
  5. | default_storage_engine           | InnoDB |
  6. | default_tmp_storage_engine       | InnoDB |
  7. | disabled_storage_engines         |        |
  8. | internal_tmp_disk_storage_engine | InnoDB |
  9. +----------------------------------+--------+
3.4 引入新的"non-redo" undo log 詳見《innodb-temporary-table-undo-logs
從MySQL 5.7.2 針對臨時表及相關物件引入新的"non-redo" undo log,存放於臨時表空間。該型別的undo log非 redolog, 因為臨時表在資料庫崩潰後不需要恢復,也就無需redo logs,避免了寫relog相關的io,從而提高了效能。必須指出出操作臨時表需要 undo log用於MySQL執行時的回滾、MVCC等。
3.5 支援新的DATA_GEOMETRY空間型別的資料
InnoDB現在支援MySQL-supported空間資料型別。也即,之前的空間資料是以binary BLOB資料儲存的,現在空間資料型別被對映到了一個InnoDB內部資料型別DATA_GEOMETRY.
3.6 升級innochecksum
    innochecksum--離線的InnoDB檔案校驗工具,新增新的選擇項或擴充套件的功能,如可指定特定的校驗演算法、可以只重寫校驗值而不進行驗證、可指定允許的校驗和不匹配量、顯示各類頁的個數、匯出頁型別資訊、輸出至日誌、從標準輸入讀取資料等。從 5.7.2 起可支援校驗超過2G的檔案。詳細的用法參考《innochecksum 官方文件
3.7 online DDL語句重建普通表和分割槽表
  
OPTIMIZE TABLE、ALTER TABLE … FORCE、ALTER TABLE … ENGINE=INNODB等操作支援支援使用inplace演算法。減少了重建時間和對應用的影響。
3.8 針對Fusion-io NVM 檔案系統的最佳化
   Linux系統中Fusion-io Non-Volatile Memory (NVM)檔案系統提供了原子寫能力,使InnoDB的doublewrite變得冗餘。因此,MySQL5.7.4以後,如果Fusion-io裝置支援原子寫, MySQL系統會自動關閉doublewrite,減少IO,提升效能。

小結 
   其實關於innodb的新特性和新功能 一篇遠遠不夠,下一篇繼續介紹關於 5.7 innodb  相關的知識。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/28939273/viewspace-2128842/,如需轉載,請註明出處,否則將追究法律責任。

相關文章