【MySQL】5.7新特性之三
寫在前面
本系列文章基於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型別,如:
3.2 臨時表效能最佳化
MySQL 5.7對臨時表做了極大的改動,提升效能。
透過最佳化 CREATE TABLE, DROP TABLE, TRUNCATE TABLE,和ALTER TABLE 語句的執行邏輯,提升臨時表的效能。(這個是從官網翻譯的,還沒找到除了alter之外的其他資料說明詳細的最佳化過程)
InnoDB臨時表後設資料不再儲存於InnoDB系統表而是儲存在INNODB_TEMP_TABLE_INFO,包含所有使用者和系統建立的臨時表資訊。該表在第一次在其上執行select時被建立。
3.3 新增臨時表空間
為所有 非壓縮的innodb臨時表提供一個獨立的表空間,預設的臨時表空間檔案為ibtmp1,位於資料目錄。我們可透過innodb_temp_data_file_path引數指定臨時表空間的路徑和大小。
MySQL每次重新啟動時,會重新建立臨時表空間。
注意 從5.7.5開始,新增一個系統選項 internal_tmp_disk_storage_engine 可定義磁碟臨時表的引擎型別為 InnoDB,而在這以前,只能使用 MyISAM。而在5.6.3以後新增的引數default_tmp_storage_engine是控制create temporary table建立的臨時表的儲存引擎,在以前預設是MEMORY,不要把這二者混淆了。
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 相關的知識。
本系列文章基於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型別,如:
-
mysql> alter table yy change column name name varchar(256) ,algorithm=inplace;
- ERROR 1846 (0A000): ALGORITHM=INPLACE is not supported. Reason: Cannot change column type INPLACE. Try ALGORITHM=COPY.
-
mysql> alter table yy change column name name varchar(255) ,algorithm=inplace;
-
Query OK, 0 rows affected (0.05 sec)
-
Records: 0 Duplicates: 0 Warnings: 0
-
mysql> alter table yy change column name name varchar(256) ,algorithm=copy;
-
Query OK, 1 row affected (0.10 sec)
-
Records: 1 Duplicates: 0 Warnings: 0
-
mysql> alter table yy change column name name varchar(100) ,algorithm=inplace;
- ERROR 1846 (0A000): ALGORITHM=INPLACE is not supported. Reason: Cannot change column type INPLACE. Try ALGORITHM=COPY.
MySQL 5.7對臨時表做了極大的改動,提升效能。
透過最佳化 CREATE TABLE, DROP TABLE, TRUNCATE TABLE,和ALTER TABLE 語句的執行邏輯,提升臨時表的效能。(這個是從官網翻譯的,還沒找到除了alter之外的其他資料說明詳細的最佳化過程)
InnoDB臨時表後設資料不再儲存於InnoDB系統表而是儲存在INNODB_TEMP_TABLE_INFO,包含所有使用者和系統建立的臨時表資訊。該表在第一次在其上執行select時被建立。
-
mysql> desc information_schema.INNODB_TEMP_TABLE_INFO;
-
+----------------------+---------------------+------+-----+---------+-------+
-
| Field | Type | Null | Key | Default | Extra |
-
+----------------------+---------------------+------+-----+---------+-------+
-
| TABLE_ID | bigint(21) unsigned | NO | | 0 | |
-
| NAME | varchar(202) | YES | | NULL | |
-
| N_COLS | int(11) unsigned | NO | | 0 | |
-
| SPACE | int(11) unsigned | NO | | 0 | |
-
| PER_TABLE_TABLESPACE | varchar(64) | YES | | NULL | |
-
| IS_COMPRESSED | varchar(64) | YES | | NULL | |
-
+----------------------+---------------------+------+-----+---------+-------+
- 6 rows in set (0.00 sec)
為所有 非壓縮的innodb臨時表提供一個獨立的表空間,預設的臨時表空間檔案為ibtmp1,位於資料目錄。我們可透過innodb_temp_data_file_path引數指定臨時表空間的路徑和大小。
-
mysql> show global variables like 'innodb_temp_data_file_path';
-
+----------------------------+-----------------------+
-
| Variable_name | Value |
-
+----------------------------+-----------------------+
-
| innodb_temp_data_file_path | ibtmp1:12M:autoextend |
-
+----------------------------+-----------------------+
- 1 row in set (0.00 sec)
注意 從5.7.5開始,新增一個系統選項 internal_tmp_disk_storage_engine 可定義磁碟臨時表的引擎型別為 InnoDB,而在這以前,只能使用 MyISAM。而在5.6.3以後新增的引數default_tmp_storage_engine是控制create temporary table建立的臨時表的儲存引擎,在以前預設是MEMORY,不要把這二者混淆了。
-
mysql> show global variables like '%storage_engine%';
-
+----------------------------------+--------+
-
| Variable_name | Value |
-
+----------------------------------+--------+
-
| default_storage_engine | InnoDB |
-
| default_tmp_storage_engine | InnoDB |
-
| disabled_storage_engines | |
-
| internal_tmp_disk_storage_engine | InnoDB |
- +----------------------------------+--------+
從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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- MySQL 5.7 新特性大全和未來展望MySql
- #MySQL# mysql5.7新特性之半同步複製MySql
- MySQL5.7新特性之備份工具mysqlpump的使用MySql
- MySQL 5.6, 5.7, 8.0版本的新特性彙總大全MySql
- MySQL 5.7新特性之線上收縮undo表空間MySql
- MySQL5.7 group by新特性報錯1055的解決辦法MySql
- MySQL 5.7 新特性 共享臨時表空間及臨時表改進MySql
- MySQL 5.7 學習心得之安全相關特性MySql
- MySQL 8.0 新特性MySql
- MySQL 5.7主從新增新從庫MySql
- mysql5.1的新特性MySql
- MySQL8.0-新特性-DescendingIndexMySqlIndex
- MySQL-18 MySQL8其他新特性MySql
- MySQL 5.7新支援--通用表空間實戰MySql
- MySQL 8.0 新特性梳理彙總MySql
- MySQL8.0-新特性彙總MySql
- MySQL 8 新特性之Clone PluginMySqlPlugin
- MySQL 8 新特性之Invisible IndexesMySqlIndex
- mysql8.0.11新特性測試MySql
- MySQL9的3個新特性MySql
- 一文看完MySQL 9.0新特性!MySql
- MySQL 8部分新特性(8.0.17)MySql
- mysql8.0新特性--隱藏索引MySql索引
- Mysql8.0部分新特性MySql
- MySQL8.0 新特性 top10MySql
- C# 9.0新特性詳解系列之三:模組初始化器C#
- Docker 部署 mysql 5.7DockerMySql
- Install MySQL 5.7 in the DockerMySqlDocker
- MySQL 8.0新特性-倒敘索引 desc indexMySql索引Index
- MySQL8.0新特性-CTE語法支援MySql
- MySQL8.0.16新特性:The Communication Protocol In Group ReplicationMySqlProtocol
- MySQL8.0 新特性:Partial Update of LOB ColumnMySql
- mysql 5.7主從配置MySql
- yum install mysql5.7MySql
- MySQL:5.6 升級 5.7MySql
- mysql5.7MHA配置MySql
- Docker 安裝 Mysql 5.7DockerMySql
- MySQL 5.7 InnoDB Tablespace EncryptionMySql
- Mysql 5.7 MHA 高可用MySql