Innodb儲存引擎

技術小美發表於2017-11-10

InnoDB是什麼 

    InnoDB,是MySQL的資料庫引擎之一,與傳統的ISAM與MyISAM相比,InnoDB的最大特色就是支援了ACID相容的事務 (Transaction)功能,類似於PostgreSQL。 

    目前InnoDB採用雙軌制授權,一是GPL授權,另一是專有軟體授權。 

    MySQL5.5以後預設使用InnoDB儲存引擎,其中InnoDB和BDB提供事務安全表,其它儲存引擎都是非事務安全表。 

    如果沒有指定InnoDB配置選項,MySQL將在MySQL資料目錄下建立一個名為ibdata1的10MB大小的自動擴充套件資料檔案,以及兩個名為 ib_logfile0和ib_logfile 1的5MB大小的日誌檔案。 

    ibdata1的大小在my.cnf檔案中配置:innodb_data_file_path = ibdata1:10G:autoextend 

    可以設定最大資料檔案限制,以免超過系統支援的最大檔案: innodb_data_file_path = ibdata1:100M:autoextend:max:500M 

    日誌檔案大小在my.cnf檔案中配置:innodb_log_file_size = 256M innodb_log_files_in_group = 2 

    Innodb儲存引擎可以使用共享表空間或獨立表空間,使用獨立表空間時,需要將innodb_file_per_table加到配置檔案中,也可以在 variables中開啟。 

    共享表空間是將所有的表的資料和索引儲存在ibdata1中,這樣的缺點是拷貝時必須拷貝整個大檔案,而且刪除表後容易產生碎片。 

    獨立表空間是為每個表建立一個.ibd檔案用來儲存資料和.frm用來存資料詞典資訊,這樣,mysql就將innodb表的資料存入各自對應的.ibd 檔案中了,但結構等資訊還是會寫入ibdata。 innodb_file_per_table變數只能在配置檔案裡修改,不能使用set global … 將innodb_file_per_table關閉之後,建立innoDB表時只生成.frm檔案,資料和索引都儲存在共享表空間ibdata1中。 

    修改預設引擎的方法 修改InnoDB預設引擎:修改配置檔案中的default-storage-engine。在配置檔案my.ini中的 [mysqld] 下面加入default-storage-engine=INNODB 

    檢視當前資料庫預設引擎:show variables like ‘default_storage_engine’ 

    列出當前資料庫所支援到引擎:show engines和show variables like ‘have%’其中Value顯示為disabled的記錄表示資料庫支援此引擎,而在資料庫啟動時被禁用。 

    在MySQL5.1以後,INFORMATION_SCHEMA資料庫中存在一個ENGINES的表,它提供的資訊與show engines;語句完全一樣,可以使用下面語句來查詢哪些儲存引擎支援事物處理:select engine from information_chema.engines where transactions = ‘yes`; 通過engine關鍵字在建立或修改資料庫時指定所使用到引擎。 


InnoDB特點 


    InnoDB儲存引擎提供了具有提交、回滾和崩潰恢復能力的事務安全。但是要對比MyISAM的儲存引擎,InnoDB寫的處理效率差一些並且會佔用更多 的磁碟空間以保留資料和索引。InnoDB表型別可以看作是對MyISAM的進一步更新產品,它提供了事務、行級鎖機制和外來鍵約束的功能。 

    Innodb儲存引擎管理主要基於兩個檔案:表空間資料檔案和日誌檔案。 

    InnoDB儲存它的表&索引在一個表空間中,表空間可以包含數個檔案(或原始磁碟分割槽)。 

    1)自動增長列:   

        InnoDB表的自動增長列可以手工插入,但是插入的如果是空或0,則實際插入到則是自動增長後到值。可以通過”ALTER TABLE…AUTO_INCREMENT=n;”語句強制設定自動增長值的起始值,預設為1,但是該強制到預設值是儲存在記憶體中,資料庫重啟後該值將會 丟失。可以使用LAST_INSERT_ID()查詢當前執行緒最後插入記錄使用的值。如果一次插入多條記錄,那麼返回的是第一條記錄使用的自動增長值。 

        對於InnoDB表,自動增長列必須是索引。如果是組合索引,也必須是組合索引的第一列,但是對於MyISAM表,自動增長列可以是組合索引的其他列,這 樣插入記錄後,自動增長列是按照組合索引到前面幾列排序後遞增的。 

    2)外來鍵約束:

      MySQL支援外來鍵的儲存引擎只有InnoDB,在建立外來鍵的時候,父表必須有對應的索引,子表在建立外來鍵的時候也會自動建立對應的索引。 

        在建立索引的時候,可以指定在刪除、更新父表時,對子表進行的相應操作,包括restrict、cascade、set null和no action。其中restrict和no action相同,是指限制在子表有關聯的情況下,父表不能更新;casecade表示父表在更新或刪除時,更新或者刪除子表對應的記錄;set null 則表示父表在更新或者刪除的時候,子表對應的欄位被set null。   

        當某個表被其它表建立了外來鍵參照,那麼該表對應的索引或主鍵被禁止刪除。   

        可以使用set foreign_key_checks=0;臨時關閉外來鍵約束,set foreign_key_checks=1;開啟約束。


本文轉自: http://www.linux78.com/innodb-storage-engine.html

Linux起點

本文轉自 Tenderrain 51CTO部落格,原文連結:http://blog.51cto.com/tenderrain/1601725


相關文章