mysql-innoDB概述

本文內容基於MySQL5.7

定義

InnoDB是一種兼顧了高可靠性和高性能的通用存儲引擎。在MySQL 5.7中,InnoDB是默認的MySQL存儲引擎。除非您配置了其他默認存儲引擎,否則發出CREATE TABLE不帶ENGINE= 子句的語句將創建一個InnoDB表。

優點

它的DML操作遵循 ACID模型,並 具有具有 提交,回滾和 崩潰恢復 功能的事務, 以保護用戶數據

行級鎖定和Oracle風格的一致讀取可提高多用戶併發性和性能。

InnoDB表格將您的數據排列在磁盤上以基於主鍵優化查詢 。每個 InnoDB表都有一個稱爲聚集索引的主鍵索引,該索引 組織數據以最小化主鍵查找的I / O。

維護數據 完整性, InnoDB支持 FOREIGN KEY約束。使用外鍵檢查插入,更新和刪除操作,以確保它們不會導致不同表之間的不一致

如果服務器由於硬件或軟件問題而崩潰,無論當時數據庫中發生了什麼,重新啓動數據庫後都無需執行任何特殊操作。InnoDB 崩潰恢復會 自動完成崩潰之前已提交的所有更改,並撤消正在處理但尚未提交的所有更改。只需重新啓動,然後從上次中斷的地方繼續即可。

該InnoDB存儲引擎維護它自己的 緩衝池,在主內存緩存表和索引數據作爲數據被訪問。經常使用的數據直接從內存中處理。此緩存適用於多種類型的信息,並可以加快處理速度。在專用數據庫服務器上,通常將多達80%的物理內存分配給緩衝池。

如果將相關數據拆分到不同的表中,則可以設置 強制 引用完整性的外鍵。更新或刪除數據,並自動更新或刪除其他表中的相關數據。嘗試將數據插入到輔助表中,而在主表中沒有相應的數據,那麼不良數據將自動被踢出。

如果數據在磁盤或內存中損壞,則 校驗和機制會在使用前提醒您注意虛假數據。

當爲每個表設計具有適當主鍵列的數據庫時 ,涉及這些列的操作會自動進行優化。在WHERE 子句,ORDER BY子句, GROUP BY 子句和聯接操作中引用主鍵列非常快速 。

插入,更新和刪除通過稱爲更改緩衝的自動機制進行了優化。InnoDB不僅允許對同一表的併發讀寫訪問,而且還緩存更改的數據以簡化磁盤I / O。

性能收益不僅限於具有長時間運行的查詢的巨型表。當從表中一遍又一遍地訪問相同的行時,稱爲“ 自適應哈希索引”的功能 將使這些查找變得更快,就像它們是從哈希表中出來一樣。

您可以壓縮表和關聯的索引。

您可以創建和刪除索引,而對性能和可用性的影響要小得多。

截斷 每表文件表 空間非常快,並且可以釋放磁盤空間供操作系統重用,而不是釋放只能重用的系統表空間中的空間InnoDB。

BLOB使用DYNAMIC行格式, 對於長文本字段,表數據的存儲佈局更爲有效 。

您可以通過查詢INFORMATION_SCHEMA 表來監視存儲引擎的內部工作情況 。

您可以通過查詢性能架構表來監視存儲引擎的性能詳細信息 。

您可以自由地將InnoDB表與其他MySQL存儲引擎中的表混合使用,即使在同一條語句中也是如此。例如,您可以使用 聯接操作在單個查詢中合併來自InnoDB和 MEMORY表的數據。

InnoDB 設計用於處理大量數據時的CPU效率和最佳性能。

InnoDB 表可以處理大量數據,即使在文件大小限制爲2GB的操作系統上也是如此。

功能

B樹索引 是
備份/時間點恢復(在服務器中而不是在存儲引擎中實現。) 是
聚集索引 是
壓縮數據 是
資料快取 是
加密數據 是(通過加密功能在服務器中實現;在MySQL 5.7和更高版本中,支持靜態數據表空間加密。)
外鍵支持 是
全文搜索索引 是(MySQL 5.6和更高版本提供InnoDB對FULLTEXT索引的支持。)
地理空間數據類型支持 是
地理空間索引支持 是(MySQL 5.7和更高版本提供InnoDB對地理空間索引的支持。)
索引緩存 是
鎖定粒度 行
MVCC 是
複製支持(在服務器中而不是在存儲引擎中實現。) 是
儲存限制 64TB
交易次數 是
更新數據字典的統計信息 是

最佳實踐

使用查詢頻率最高的一個或多個列爲每個表 指定一個主鍵, 如果沒有明顯的主鍵,則指定一個 自動增量值。

使用聯接時,無論是基於多個表中相同的ID值,還是從多個表中提取數據。爲了提高連接性能,請在連接列上定義 外鍵,並在每個表中使用相同的數據類型聲明這些列。添加外鍵可確保對引用的列進行索引,從而可以提高性能。外鍵還將刪除或更新傳播到所有受影響的表,並且如果父表中不存在相應的ID,則可以防止在子表中插入數據。

關閉自動提交。每秒提交數百次會限制性能(受存儲設備的寫入速度限制)。

分組組相關的DML 操作成 交易,通過包圍他們START TRANSACTION和 COMMIT報表。雖然你不想過於頻繁地提交,你也不想發出的巨大的批次 INSERT, UPDATE或 DELETE陳述,不提交運行小時。

不使用LOCK TABLES 語句。InnoDB可以一次處理多個會話,一次讀寫同一張表,而無需犧牲可靠性或高性能。要獲得對一組行的排他性寫訪問權限,請使用 SELECT … FOR UPDATE語法僅鎖定要更新的行。

啓用該 innodb_file_per_table選項或使用常規表空間將表的數據和索引放入單獨的文件中,而不是 系統表空間中。

innodb_file_per_table 默認情況下啓用 該選項。

評估您的數據和訪問模式是否受益於InnoDB表或頁面 壓縮功能。您可以在InnoDB不犧牲讀/寫能力的情況下壓縮表。

–sql_mode=NO_ENGINE_SUBSTITUTION 如果在中的ENGINE=子句中 指定的引擎存在問題 ,則可以選擇運行服務器 以防止使用其他存儲引擎創建表 CREATE TABLE。

查詢默認存儲引擎
SELECT * FROM INFORMATION_SCHEMA.ENGINES;

MySQL服務器選項文件部分中default-storage-engine=innodb 定義的服務器 ,來確定數據庫服務器或應用程序是否可以正常使用[mysqld]。

ACID模型

原子性

ACID模型 的原子性方面主要涉及InnoDB 事務。相關的MySQL功能包括:
自動提交設置。
COMMIT 聲明。
ROLLBACK 聲明。
INFORMATION_SCHEMA 表中的 操作數據。

一致性

ACID模型 的一致性方面主要涉及內部InnoDB處理,以防止數據崩潰。相關的MySQL功能包括:
InnoDB doublewrite緩衝區。
InnoDB 崩潰恢復。

隔離

ACID模型 的隔離方面主要涉及InnoDB 事務,尤其是適用於每個事務的隔離級別。相關的MySQL功能包括:
自動提交設置。
SET ISOLATION LEVEL 聲明。
InnoDB 鎖定 的底層細節。在性能調整期間,您可以通過INFORMATION_SCHEMA表格查看這些詳細信息 。

持久性

ACID模型 的持久性方面涉及與特定硬件配置交互的MySQL軟件功能。由於取決於您的CPU,網絡和存儲設備的功能的可能性很多,因此爲具體的準則提供最複雜的方面。(這些準則可能採取購買“ 新硬件 ”的形式 。)相關的MySQL功能包括:

InnoDB doublewrite buffer,由innodb_doublewrite 配置選項打開和關閉 。
配置選項 innodb_flush_log_at_trx_commit。
配置選項 sync_binlog。
配置選項 innodb_file_per_table。
存儲設備(例如磁盤驅動器,SSD或RAID陣列)中的寫緩衝區。
存儲設備中由電池支持的緩存。
用來運行MySQL的操作系統,特別是它對fsync()系統調用的支持。
不間斷電源(UPS)保護運行MySQL服務器並存儲MySQL數據的所有計算機服務器和存儲設備的電源。
您的備份策略,例如備份的頻率和類型以及備份保留期。
對於分佈式或託管數據應用程序,MySQL服務器的硬件所在的數據中心的特定特性,以及數據中心之間的網絡連接。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章