day09-1儲存引擎

2022-10-09 21:01:14

儲存引擎

1.基本介紹

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

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

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

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

資料庫中的表也應該有不同的型別,表的型別不同,會對應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;