存儲引擎 1.基本介紹 基本介紹 MySQL的表類型由存儲引擎(Storage Engines)決定,主要包括MyISAM、innoDB、Memory等 MySQL數據表主要支持六種類型,分別是:CSV,Memory,ARCHIVE,MRG_MYISAM,MYISAM,InnoBDB。 這六種又分為 ...
存儲引擎
1.基本介紹
- 基本介紹
-
MySQL的表類型由存儲引擎(Storage Engines)決定,主要包括MyISAM、innoDB、Memory等
-
MySQL數據表主要支持六種類型,分別是:CSV,Memory,ARCHIVE,MRG_MYISAM,MYISAM,InnoBDB。
-
這六種又分為兩類,一類是”事務安全型“(transaction-safe),例如:InnoDB。
剩下的五種都是第二類,稱為“非事務安全型”(non-transaction-safe)
資料庫中的表也應該有不同的類型,表的類型不同,會對應mysql不同的存取機制,表類型又稱為存儲引擎。
- 主要的存儲引擎(表類型)特點
特點 | Myisam | Memory | InnoDB | Archive |
---|---|---|---|---|
存儲限制 | 沒有 | 有 | 64TB | 沒有 |
事務安全 | 支持 | |||
鎖機制 | 表鎖 | 表鎖 | 行鎖 | 行鎖 |
B樹索引 | 支持 | 支持 | 支持 | |
哈希索引 | 支持 | 支持 | ||
全文索引 | 支持 | |||
集群索引 | 支持 | |||
數據緩存 | 支持 | 支持 | ||
索引緩存 | 支持 | 支持 | 支持 | |
數據可壓縮 | 支持 | 支持 | ||
空間使用 | 低 | N/A | 高 | 非常低 |
記憶體使用 | 低 | 中等 | 高 | 低 |
批量插入的速度 | 高 | 高 | 低 | 非常高 |
支持外鍵 | 支持 |
- 細節說明
- MyISAM不支持事務,也不支持外鍵,但是其訪問速度快,對事務完整性沒有要求
- InnoDB存儲引擎提供了具有提交、回滾和崩潰能力的事務安全。但是比起MyISAM存儲引擎,InnoDB寫得處理效率差一些,並且會占用更多的磁碟空間以保留數據和索引
- MEMORY存儲引擎使用存在記憶體中的內容來創建表。每個MEMORY表只實際對應一個磁碟文件。MEMORY類型的表訪問非常地快,因為它的數據是存放在記憶體中的,並且預設使用HASH索引。但是一旦MySQL服務關閉,表中的數據就會丟失,表的結構還在。
2.使用
-
三種存儲引擎表使用案例
對於前面我們提到的三種存儲引擎,我們舉例說明
-- 表類型和存儲引擎
-- 查看所有的存儲引擎
SHOW ENGINES
-- InnoDB存儲引擎是前面使用過的
-- 1.支持事務 2.支持外鍵 3.支持行級鎖
-- myisam存儲引擎
CREATE TABLE t28(
id INT,
`name` VARCHAR(32)) ENGINE MYISAM
-- 1.添加速度快 2.不支持外鍵和事務 3.支持表級鎖
START TRANSACTION;
SAVEPOINT a;
INSERT INTO t28 VALUES(1,'jack');
SELECT * FROM t28;
ROLLBACK TO a; -- 失敗,myisam不支持事務
-- memory存儲引擎
-- 1.數據存儲在記憶體中[關閉了mysql服務表數據就會丟失,但是表結構還在]
-- 2.執行速度佷快(沒有IO讀寫) 3.預設支持索引(hash表)
CREATE TABLE t29(
id INT,
`name` VARCHAR(32)) ENGINE MEMORY
INSERT INTO t29 VALUES(1,'tom'),(2,'jack'),(3,'hsp');
SELECT * FROM t29;
-- 重啟mysql服務之後
DESC t29; -- 表結構還在
SELECT * FROM t29;-- 表數據丟失了
- 如何選擇表的存儲引擎
-
如果你的應用不需要事務,處理的只是基本的CRUD操作,那麼MyISAM是不二選擇,速度快
-
如果需要支持事務,選擇InnoDB
-
Memory存儲引擎就是將數據存儲在記憶體中,由於沒有磁碟IO的等待,速度極快。但由於是記憶體存儲引擎,所做的任何修改在伺服器重啟後都將消失。(經典用法:用戶的線上狀態)
- 指令修改存儲引擎
alter table table_name engine = 存儲引擎名;
例子
-- 表類型和存儲引擎
-- 查看所有的存儲引擎
SHOW ENGINES
-- InnoDB存儲引擎是前面使用過的
-- 1.支持事務 2.支持外鍵 3.支持行級鎖
-- myisam存儲引擎
CREATE TABLE t28(
id INT,
`name` VARCHAR(32)) ENGINE MYISAM
-- 1.添加速度快 2.不支持外鍵和事務 3.支持表級鎖
START TRANSACTION;
SAVEPOINT a;
INSERT INTO t28 VALUES(1,'jack');
SELECT * FROM t28;
ROLLBACK TO a; -- 失敗,myisam不支持事務
-- memory存儲引擎
-- 1.數據存儲在記憶體中[關閉了mysql服務表數據就會丟失,但是表結構還在]
-- 2.執行速度佷快(沒有IO讀寫) 3.預設支持索引(hash表)
CREATE TABLE t29(
id INT,
`name` VARCHAR(32)) ENGINE MEMORY
INSERT INTO t29 VALUES(1,'tom'),(2,'jack'),(3,'hsp');
SELECT * FROM t29;
-- 重啟mysql服務之後
DESC t29; -- 表結構還在
SELECT * FROM t29;-- 表數據丟失了
-- 修改存儲引擎名
ALTER TABLE t29 ENGINE = INNODB;