InnoDB簡介

jx_yu發表於2016-03-15

InnoDB是一個通用的高效能、高可靠性的儲存引擎。從MySQL 5.5開始,是MySQL預設的儲存引擎

 

InnoDB表關鍵特性

1.   DML操作遵循ACID原則,事務透過commit, rollback, and crash-recovery等功能來保護使用者資料

2.   支援行級鎖,類似oracle方式一致性讀來提高多使用者併發和效能

3.   InnoDB表按照主鍵的順序組織存放在磁碟上(索引組織表),最佳化基於主鍵的查詢

4.   支援外來鍵約束

5.   可以與其他儲存引擎的表混合使用。如join查詢等

6.   當處理大量資料時,innoDB能高效利用CPU

 

InnoDB引擎特點

clip_image002

a.支援地理空間索引 從MySQL 5.7.5開始

b.Innodb不支援hash索引,但是innodb內部使用hash索引實現自適應雜湊功能

c.支援全文索引 從MySQL 5.6.4開始

d.Barracuda檔案格式下支援壓縮表

efg.server層實現 資料加密、主從複製、備份和point-in-time恢復

 

InnoDB在記憶體中使用buffer pool來快取資料和索引。

預設,innodb_file_per_table是開啟的,每個表和與其相關的索引儲存在單獨的一個檔案中;

innodb_file_per_table關閉時,所有innodb表和索引都儲存在單個系統表空間(可能包含幾個檔案或者分割槽)。

 

MySQL 5.7.6開始,innodb表可以儲存在普通表空間,多個表共享一個表空間儲存資料

Innodb表可以處理大量資料,即使在檔案大小限制為2GBOS

 

Innodb作為預設儲存引擎

MySQL 5.7 innodb是預設的儲存引擎。Innodbmysql中是事務安全的儲存引擎,透過commit, rollback, and crash-recovery功能來保護使用者資料。Innodb 行級鎖(沒有鎖升級的問題),並且類似oracle的一致性讀來提高多使用者併發性。Innodb表是索引組織表,以主鍵的順序來組織存放資料從而減少IO。支援外來鍵約束。

 

Innodb表的好處

1.       Crash recovery

2.       Buffer pool緩衝訪問的資料和索引,熱點資料直接在記憶體中處理,此快取使用於多種型別的資訊,從而加速了處理。

3.       外來鍵約束

4.       如果磁碟或者記憶體中的資料損壞了,在使用它之前可以使用checksum機制來修復資料

5.       索引組織表的特性,透過主鍵where ,order by,group byjoin查詢是快速的

6.       Change buffering特性,自動最佳化DML操作。Innodb表不僅允許並行的讀寫,它還快取修改的資料來減少IO

7.       自適應雜湊

8.       壓縮表和與其關聯的索引

9.       線上刪除和建立索引

10.   可以快速的Truncate一個file_per_table,並且釋放的空間,作業系統可重用。而不是file_per_table關閉狀態下,是存放在系統表空間,釋放的空間,僅僅innodb可以重用

11.   對於BLOBlong text的儲存效率更高,在動態行模式下

12.   可以透過INFORMATION_SCHEMA監控內部工作

13.    可以透過Performance 下面的表來檢視效能相關資訊

 

Innodb表最佳實踐

一些使用innodb表的建議:

1.       為每張表定義一個主鍵:使用最常查詢的列(或多列),若沒有明顯的主鍵,使用一個自增長的值作為主鍵

2.       關閉autocommit對效能的上限最大每秒提交上百次(由儲存裝置的IO效能限制)

3.       使用START TRANSACTION COMMIT來控制事務提交的粒度

4.       不要使用LOCK TABLES語句,innodb在不犧牲可靠性和高效能的同時能處理多個會話對同一個表的讀和寫。為了得到一些行獨佔訪問,可以使用SELECT ... FOR UPDATE來鎖定期望的行

5.       開啟innodb_file_per_table選項將各個表的資料和索引存放在單獨的檔案中,而不是放在一個巨大的system表空間。並且便於一些功能的使用,如:表壓縮、快速truncate等。

innodb_file_per_table MySQL 5.6.6開始預設是開啟的

6.       評估你的資料和訪問模式是否適用於innodb表壓縮特性(create table語句指定(ROW_FORMAT=COMPRESSED)),表壓縮可以提高IO效能

7.       執行時指定--sql_mode=NO_ENGINE_SUBSTITUTION選項來防止需要的儲存引擎被禁用或未編譯,自動替換儲存引擎

 

關閉InnoDB引擎

Oracle推薦innoDB為首選,從MySQL 5.5開始,其為預設儲存引擎。

MySQL 5.7.5開始,--skip-innodb (--innodb=OFF, --disable-innodb)選項被棄用,如果使用此選項,將會得到一個警告。在未來的MySQL版本中此選項將被刪除。

 

而在5.7.5之前,如果你不想使用innodb表,則透過如下步驟來關閉:

1.       啟動的時候指定--innodb=OFF 或者 --skip-innodb來關閉innodb引擎

2.       因為innodb是預設引擎,所以要想關閉其,必須使用--default-storage-engine --default-tmp-storage-engine來設定預設的其他引擎來為永久和臨時表引擎

3.       為了防止當查詢innodb相關information_schema表時資料庫crash,需要禁用其相關表。在my.cnf位置檔案中[mysqld]部分指定如下內容:

loose-innodb-trx=0
loose-innodb-locks=0
loose-innodb-lock-waits=0
loose-innodb-cmp=0
loose-innodb-cmp-per-index=0
loose-innodb-cmp-per-index-reset=0
loose-innodb-cmp-reset=0
loose-innodb-cmpmem=0
loose-innodb-cmpmem-reset=0
loose-innodb-buffer-page=0
loose-innodb-buffer-page-lru=0
loose-innodb-buffer-pool-stats=0
loose-innodb-metrics=0
loose-innodb-ft-default-stopword=0
loose-innodb-ft-inserted=0
loose-innodb-ft-deleted=0
loose-innodb-ft-being-deleted=0
loose-innodb-ft-config=0
loose-innodb-ft-index-cache=0
loose-innodb-ft-index-table=0
loose-innodb-sys-tables=0
loose-innodb-sys-tablestats=0
loose-innodb-sys-indexes=0
loose-innodb-sys-columns=0
loose-innodb-sys-fields=0
loose-innodb-sys-foreign=0
loose-innodb-sys-foreign-cols=0


參考連結:
http://dev.mysql.com/doc/refman/5.7/en/innodb-check-availability.html
 http://dev.mysql.com/doc/refman/5.7/en/innodb-turning-off.html

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