天天看點

Innodb存儲引擎

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;打開限制。

Linux起點

      本文轉自Tenderrain 51CTO部落格,原文連結:http://blog.51cto.com/tenderrain/1601725,如需轉載請自行聯系原作者