day09-1存儲引擎

存儲引擎

1.基本介紹

  • 基本介紹
  1. MySQL的表類型由存儲引擎(Storage Engines)決定,主要包括MyISAM、innoDB、Memory等

  2. MySQL數據表主要支援六種類型,分別是:CSV,Memory,ARCHIVE,MRG_MYISAM,MYISAM,InnoBDB。

  3. 這六種又分為兩類,一類是」事務安全型「(transaction-safe),例如:InnoDB。

    剩下的五種都是第二類,稱為「非事務安全型」(non-transaction-safe)

image-20221009172916332

資料庫中的表也應該有不同的類型,表的類型不同,會對應mysql不同的存取機制,表類型又稱為存儲引擎。

  • 主要的存儲引擎(表類型)特點
特點 Myisam Memory InnoDB Archive
存儲限制 沒有 64TB 沒有
事務安全 支援
鎖機制 表鎖 表鎖 行鎖 行鎖
B樹索引 支援 支援 支援
哈希索引 支援 支援
全文索引 支援
集群索引 支援
數據快取 支援 支援
索引快取 支援 支援 支援
數據可壓縮 支援 支援
空間使用 N/A 非常低
記憶體使用 中等
批量插入的速度 非常高
支援外鍵 支援
  • 細節說明
  1. MyISAM不支援事務,也不支援外鍵,但是其訪問速度快,對事務完整性沒有要求
  2. InnoDB存儲引擎提供了具有提交、回滾和崩潰能力的事務安全。但是比起MyISAM存儲引擎,InnoDB寫得處理效率差一些,並且會佔用更多的磁碟空間以保留數據和索引
  3. 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;-- 表數據丟失了
  • 如何選擇表的存儲引擎
  1. 如果你的應用不需要事務,處理的只是基本的CRUD操作,那麼MyISAM是不二選擇,速度快

  2. 如果需要支援事務,選擇InnoDB

  3. Memory存儲引擎就是將數據存儲在記憶體中,由於沒有磁碟IO的等待,速度極快。但由於是記憶體存儲引擎,所做的任何修改在伺服器重啟後都將消失。(經典用法:用戶的在線狀態)

    image-20221009185035958

  • 指令修改存儲引擎
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;