MySQL存储引擎 INNODB和MYISAM

存储引擎概述

什么是存储引擎

是数据库底层软件组件,数据库管理系统使用数据索引进行创建、查询、更新和删除数据操作。不同的存储引擎提供不同的存储机制、索引技巧】锁定水平等功能,使用不同的存储引擎可以获得特定的功能

MySQL5.7支持的存储引擎

InnoDB、MyISAM、Memory、Merge、Archive、Federated、CSV、BLACKHOLE等。使用show engines语句可以查看系统支持的引擎类型

功能 MyISAM MEMORY InnoDB Archive
存储限制 256TB RAM 64TB None
支持事务 no no yes no
支持全文索引 yes no no no
支持树索引 yes yes yes no
支持哈希索引 no yes no no
支持数据缓存 no N/A yes no
支持外键 no no yes no

InnoDB 适用于需要提交、回滚和恢复的事务安全(ACID)能力,并要求实现并发控制,是 MySQL的默认存储引擎

MyISAM能够为数据表的插入和查询记录提供较高的处理效率

如果只是临时存放数据,数据量不大,并且不需要较高的数据安全性,可以选择将数据保存在内存的 MEMORY 引擎中,MySQL 中使用该引擎作为临时表,存放查询的中间结果。

如果只有 INSERT 和 SELECT 操作,可以选择Archive 引擎,Archive 存储引擎支持高并发的插入操作,但是本身并不是事务安全的。Archive 存储引擎非常适合存储归档数据

操作存储引擎

查看mysql支持的存储引擎

show engines;

MyISAM 存储引擎

MyISAM 存储引擎不支持事务,也不支持外键,特点是访问速度快,对事务完整性没有要求,以 SELECT、INSERT 为主的应用基本都可以使用这个引擎来创建表。

每个 MyISAM 表在磁盘上存储成 3 个文件,其中文件名和表名都相同,但是扩展名分别为:

(1)frm(存储表定义)

(2)MYD(MYData,存储数据)

(3)MYI(MYIndex,存储索引)

MyISAM 表还支持 3 种不同的存储格式:

(1)静态(固定长度)表

(2)动态表

(3)压缩表

InnoDB存储引擎

是MySQL的默认存储引擎,在下场景中使 用 InnoDB 存储引擎是最理想的选择:

(1)更新密集的表:InnoDB 存储引擎特别适合处理多重并发的更新请求。

(2)事务:InnoDB 存储引擎是支持事务的标准 MySQL 存储引擎。

(3)自动灾难恢复:与其它存储引擎不同,InnoDB 表能够自动从灾难中恢复。

(4)外键约束:MySQL 支持外键的存储引擎只有 InnoDB。

(5)支持自动增加列 AUTO_INCREMENT 属性。

Innodb的数据文件:

ibd:数据表的数据文件

frm:数据表的元数据

opt:存储的是mysql的一些配置信息,如编码、排序的信息等

修改默认的存储引擎

创建表,并查看默认用的存储引擎

cpp 复制代码
创建表,并查看默认用的存储引擎
mysql> create database auth;
mysql> use auth  
mysql> CREATE TABLE t1 (user_name CHAR(16), user_passwd CHAR(48));

mysql> show table status from auth where name='t1'\G

通过 alter table 修改

cpp 复制代码
mysql> alter table t1 engine=MyISAM;
mysql> show table status from auth where name='t1'\G

通过 create table 创建表时指定存储引擎

cpp 复制代码
[root@localhost ~]# vim /etc/my.cnf
[mysqld]
//添加下面语句
default-storage-engine=MyISAM

[root@localhost ~]# systemctl restart mysqld
[root@localhost ~]# mysql -uroot -ppwd123
mysql> use auth

mysql> CREATE TABLE t2 (user_name CHAR(16), user_passwd CHAR(48));
mysql> show table status from auth where name='t2'\G

临时修改默认存储引擎

cpp 复制代码
SET default_storage_engine=< 存储引擎名 >

MyISam和InnoDB实例比较

1:创建两张表分别以MyIsam和InnoDB作为存储引擎

cpp 复制代码
create database test;
use test;
create table tm(id int(20) primary key auto_increment,name char(30)) engine=myisam;
create table ti(id int(20) primary key auto_increment,name char(30)) engine=innodb;
mysql> show create table tm\G
mysql> show create table ti\G

2.插入一千万数据,来比较两个存储引擎的存储效率

创建两个存储过程

cpp 复制代码
mysql> create procedure insertm()
begin
set @i=1;
while @i<=10000000
do
insert into tm(name) values(concat("wy",@i));
set @i=@i+1;
end while;
end
$


mysql> create procedure inserti()
begin
set @i=1;
while @i<=10000000
do
insert into ti(name) values(concat("wy",@i));
set @i=@i+1;
end while;
end
$

mysql> delimiter ;

利用存储过程向两个表添加数据

cpp 复制代码
插入(一千万条)MyIsam存储引擎的表中的时间如下:

mysql> call insertm;

Query OK, 0 rows affected (1 min 49.74 sec)


插入(一千万条)InnoDB存储引擎的表中的时间如下:

 mysql> call inserti;

Query OK, 0 rows affected (13 min 32.96 sec)


根据结果得出:MyIsam存储引擎在写入方面有优势

3.查询数据总数目

cpp 复制代码
InnoDB的SQL语句的分析:
mysql> desc select count(*) from ti\G;
*************************** 1. row ***************************
           id: 1
  select_type: SIMPLE
        table: ti
   partitions: NULL
         type: index
possible_keys: NULL
          key: PRIMARY
      key_len: 4
          ref: NULL
         rows: 9732352
     filtered: 100.00
        Extra: Using index
1 row in set, 1 warning (0.00 sec)
cpp 复制代码
下面是MyIsam(他的数据存储在其他的表中所以这里是没有影响行数的)的SQL语句的分析:
mysql> desc select count(*) from tm\G;
*************************** 1. row ***************************
           id: 1
  select_type: SIMPLE
        table: NULL
   partitions: NULL
         type: NULL
possible_keys: NULL
          key: NULL
      key_len: NULL
          ref: NULL
         rows: NULL
     filtered: NULL
        Extra: Select tables optimized away
1 row in set, 1 warning (0.00 sec)

4.查询某一范围的数据

没有索引的列
cpp 复制代码
mysql> select * from tm where name>"zhangsan100" and name<"zhangsan10000000";
+---------+-----------------+
| id      | name            |
+---------+-----------------+
|    1000 | zhangsan1000    |
|   10000 | zhangsan10000   |
|  100000 | zhangsan100000  |
| 1000000 | zhangsan1000000 |
+---------+-----------------+
4 rows in set (1.69 sec)



mysql> select * from ti where name>"zhangsan100" and name<"zhangsan10000000";
+---------+-----------------+
| id      | name            |
+---------+-----------------+
|    1000 | zhangsan1000    |
|   10000 | zhangsan10000   |
|  100000 | zhangsan100000  |
| 1000000 | zhangsan1000000 |
+---------+-----------------+
4 rows in set (2.57 sec)


mysql> select * from ti where name="zhangsan9999999";
+---------+-----------------+
| id      | name            |
+---------+-----------------+
| 9999999 | zhangsan9999999 |
+---------+-----------------+
1 row in set (2.15 sec)


mysql> select * from tm where name="zhangsan9999999";
+---------+-----------------+
| id      | name            |
+---------+-----------------+
| 9999999 | zhangsan9999999 |
+---------+-----------------+
1 row in set (0.99 sec)

无索引查询 MyIsam 有优势

有索引的列
cpp 复制代码
mysql> select * from tm where id>10 and id<999999;

999988 rows in set (1.96 sec)


mysql> select * from ti where id>10 and id<999999;

999988 rows in set (0.52 sec)

有索引查询InnoDB 有优势

相关推荐
这个DBA有点耶8 分钟前
3000万个应用共享一套数据库:多租户“逻辑表”架构是如何做到的?
数据库·架构·dba
测试运维日常笔记27 分钟前
Oracle 数据库连接认证方式详解
数据库·oracle
ClouGence1 小时前
PostgreSQL 同步到 Iceberg:开源、私有部署与 SaaS 方案对比
数据库·postgresql·开源
这个DBA有点耶1 小时前
DBA进阶之路:从“修数据库”到“管架构债”
数据库·架构·dba
ACP广源盛139246256732 小时前
WAIC2026 国产超节点算力浪潮下@ACP#IX9104 在算力矩阵中的定位与落地场景
大数据·数据库·人工智能·嵌入式硬件·线性代数·矩阵
珠***格2 小时前
通信链路全打通:西格电力四可装置的 4G/5G + 加密认证技术详解
大数据·数据库·分布式·5g·架构·能源
盗理者2 小时前
AI Agent 技能分享|从零实现 MCP Server,让 Agent 安全读取数据库
数据库·oracle
xqqxqxxq3 小时前
Redis 五大常用数据类型 + 通用命令笔记
数据库·redis·笔记
l1t3 小时前
DeepSeek总结的在 pg_stat_statements 中诊断高基数工作负载
数据库·缓存·postgresql
buyue__3 小时前
Python实现连接MySQL数据库并执行目录下的所有SQL文件,遇到错误时终止执行。
python·mysql