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 | 高 | 非常低 |
記憶體使用 | 低 | 中等 | 高 | 低 |
批次插入的速度 | 高 | 高 | 低 | 非常高 |
支援外來鍵 | 支援 |
三種儲存引擎表使用案例
對於前面我們提到的三種儲存引擎,我們舉例說明
-- 表型別和儲存引擎
-- 檢視所有的儲存引擎
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;