場景
數據庫存儲引擎
數據庫存儲引擎是數據庫底層軟件組件,數據庫管理系統(DBMS )使用數據引擎進行創建、查詢、更新和刪除數據的操作。
不同的存儲引擎提供不同的存儲機制、索引技巧、鎖定水平等功能,使用不同的存儲引擎還可以獲得特定的功能。
現在許多數據庫管理系統支持多種數據引擎。 MySQL 的核心就是存儲引擎。
MySQL 提供了多種不同的存儲引擎,包括處理事務安全表的引擎和處理非事務安全表的引擎。
在 MySQL中不需要在整個服務器中使用同一種存儲引擎,可以針對具體的要求對每一個表使用不同的存儲引擎。
MySQL支持的存儲引擎有InnoDB、MyISAM、Memory、Merge、 Archive 、Federated、CSV、BLACKHOLE等。
用戶可以使用 SHOW ENGINES 語句查看系統支持的引擎類型。
注:
博客:
霸道流氓氣質-CSDN博客
實現
InnoDB存儲引擎
InnoDB 是事務型數據庫的首選引擎,支持事務安全表( ACID ),支持行鎖定和外鍵。
MySQL 的默認存儲引擎為 InnoDB, InnoDB 的主要特點如下:
(1)?InnoDB給MySQL 提供了具有提交、回滾和崩潰恢復能力的事務安全(ACID 兼容)存儲引擎。
InnoDB 鎖定在行級,并且也用 SELECT 語句提供一個類似 Oracle 的非鎖定讀。
這些功能增加了多用戶部署和性能。
在SQL 查詢中可以自由地將 InnoDB 類型的表與 MySQL 其他類型的表混合起來,甚至在同一個查詢中也可以混合。
(2) InnoDB 是為處理巨大數據量時的最大性能設計,它的 CPU 效率可能是任何其他基于磁盤的關系數據庫引擎所不能匹敵的。
(3) InnoDB 存儲引擎被完全與 MySQL 服務器整合, InnoDB存儲引擎為在主內存中緩存數據和索引而維持它自己的緩沖池。
InnoDB 的表和索引在一個邏輯表空間中, 表空間可以包含數個文件(或原始碰盤分區)。
這與 MyISAM 表不同,比如在 MyISAM 表中每個表被保存在分離的文件中。 InnoDB 表可以是任何尺寸,
即使在文件尺寸被限制為 2GB 的操作系統上。
(4) InnoDB支持外鍵完整性約束(FOREIGN KEY)。在存儲表中的數據時每張表的存儲都按主鍵順序存放,
如果沒有顯式地在定義表時指定主鍵, lnnoDB 會為每一行生成一個6字節的 ROWID ,并以此作為主鍵。
(5) InnoDB被用來在眾多需要高性能的大型數據庫站點上。InnoDB 不創建目錄,
在使用 InnoDB時MySQL 將在 MySQL 數據目錄下創建一個名為ibdatal的10MB 大小的自動擴展數據文件,
以及兩個名為ib _logfile()和ib_ logfilel的5MB大小的曰志文件。
MyISAM存儲引擎
MyISAM 基于 ISAM 存儲引擎,并對其進行擴展。它是在 Web 、數據倉儲和其他應用環境下最常使用的存儲引擎之一。
?MyISAM 擁有較高的插 入、查詢速度,但不支持事務。
MyISAM 的主要特點如下:
(1)大文件(達 63 位文件長度)在支持大文件的文件系統和操作系統上被支持。
(2)當把刪除、更新及插入混合的時候,動態尺寸的行的碎片更少,這要通過合并相鄰被刪除的塊來完成,
若下一個塊被刪除,則擴展到下一塊自動完成。
(3)每個 MyISAM 表的最大索引數是 64,這可以通過重新編譯來改變。每個索引最大的列數是 16 個。
(4)最大的鍵長度是 1000 字節,這也可以通過編譯來改變。對于鍵長度超過 25 字節的情況,使用一個超過 1024 字節的鍵塊。
(5) BLOB TEXT 列可以被索引。
(6) NULL 被允許在索引的列中,其占每個鍵的0-1字節。
(7)所有數字鍵值先以高字節位被存儲,以允許一個更高的索引壓縮。
(8)對于每個表的 AUTO_INCREMENT列, MyISAM 通過 INSERT UPDATE 操作自動更新這一列,
這使得 AUTO MENT 列更快(至少 10% )。注意,在序列項的值被刪除之后就不能再利用。
(9)可以把數據文件和索引文件放在不同目錄。
(10)每個字符列可以有不同的字符集。
(11)有VARCHAR 的表可以有固定或動態記錄長度。
(12)VARCHAR和CHAR 列可以多達 64KB。
使用 MyISAM引擎創建數據庫將產生3個文件,文件的名字以表的名字開始,擴展名指出文件類型。
fun文件存儲表定義,數據文件的擴展名為.myd ( MYData ),索引文件的擴展名為 .myi (MYindex)。
MEMORY存儲引擎
MEMORY 存儲引擎將表中的數據存儲在內存中,為查詢和引用其他表中的數據提供快速訪問。
MEMORY 的主要特點如下:
(1)MEMORY表可以有多達每個表 32 個索引,每個索引 16 列, 以及 500 字節的最大鍵長度。
(2)MEMORY存儲引擎執行 HASH和BTREE 索引。
(3)可以在一個MEMORY 表中有非唯一鍵。
(4)MEMORY表使用一個固定的記錄長度格式。
(5)MEMORY不支持 BLOB或TEXT列。
(6)MEMORY支持 AUTO_INCREMENT 列和對可包含 NULL 值的列的索引。
(7)MEMORY表在所有客戶端之間共享(就像其他任何非TEMPORARY表)。
(8)MEMORY 表內容被存在內存中,內存是MEMORY表和服務器在查詢處理的空閑中創建的內部表共享。
(9)當不再需要 MEMOR 表的內容時要釋放被 MEMORY 表使用的內存,應該執行
DELETE FROM 或 TRUNCATE TABLE,或者整個地刪除表(使用 DROP TABLE)。
存儲引擎的選擇
不同的存儲引擎有不同的特點,適用于不同的需求,為了做出正確的選擇,
用戶首先需要考慮每個存儲引擎提供了哪些不同的功能。
如果要提供提交、回滾和崩潰恢復能力的事務安全(ACID 兼容)能力,并要求實現并發控制,InnoDB是個很好的選擇。
如果數據表主要用來插入和查詢記錄,則MyISAM 引擎能提供較高的處理效率。
如果只是臨時存放數據,數據量不大,并且不需要較高的數據安全性,可以選擇將數據保存在內存中的 Memory引擎,
在MySQL 中使用該引擎作為臨時表存放查詢的中間結果。
如果只有 INSERT和SELECT 操作,可以選擇 Archive 引擎 ,Archive 引擎支持高并發的插入操作 但是本身并不是事務安全的。
Archive 引擎非常適合存儲歸檔數據 例如記錄日志信息可以使用 Archive 引擎。
具體使用哪一種引擎要根據需要靈活選擇,一個數據庫中的多個表可以使用不同引擎以滿足各種性能和實際需求,
使用合適的存儲引擎將會提高整個數據庫的性能。
Mysql更改表的存儲引擎
ALTER TABLE fruit ENGINE=MyISAM;
Mysql查看系統所支持的存儲引擎類型
SHOW ENGINES;
Mysql查看當前默認的存儲引擎
SELECT @@default_storage_engine;
Mysql查看特定庫中所有表的存儲引擎
SELECT TABLE_NAME, ENGINE FROM information_schema.TABLES WHERE TABLE_SCHEMA = '數據庫名';
Mysql查看單個表的存儲引擎
SHOW TABLE STATUS LIKE 'fruit';