跳转至

存储引擎

1.基本介绍

  • 基本介绍

  • MySQL的表类型由存储引擎(Storage Engines)决定,主要包括MyISAM、innoDB、Memory等

  • MySQL数据表主要支持六种类型,分别是:CSV,Memory,ARCHIVE,MRG_MYISAM,MYISAM,InnoBDB。

  • 这六种又分为两类,一类是”事务安全型“(transaction-safe),例如:InnoDB。

剩下的五种都是第二类,称为“非事务安全型”(non-transaction-safe)

image-20221009172916332

数据库中的表也应该有不同的类型,表的类型不同,会对应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的等待,速度极快。但由于是内存存储引擎,所做的任何修改在服务器重启后都将消失。(经典用法:用户的在线状态)

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;