当前位置:网站首页>MySQL的存储引擎
MySQL的存储引擎
2022-07-06 09:10:00 【Eric-x】
前言
要想对SQL进行优化,那么对于存储引擎的了解是必不可少的。想着那就写一篇关于引擎的文章,对自己也算是一个回顾
文章目录
1、查看存储引擎
在了解存储引擎之前,我们肯定要知道MySQL给我们提供了哪些引擎,通过:show engines 查看
2、设置系统默认的存储引擎
我们可以先查看默认的存储引擎
show variables like '%storage_engine%';
#或
SELECT @@default_storage_engine;
我的MySQL版本的8.x,可以看到默认引擎是InnoDB
那如何修改默认的存储引擎呢?
如果是8.0及以上,那么在创建表的语句中没有显式指定表的存储引擎的话,那就会默认使用 InnoDB 作为表的存储引擎。
如果是5.x,我们想改变表的默认存储引擎的话,可以这样写启动服务器的命令行:
SET DEFAULT_STORAGE_ENGINE=MyISAM;
或者修改 my.cnf 文件:
default-storage-engine=MyISAM
# 重启服务
systemctl restart mysqld.service
3、设置表的存储引擎
存储引擎是负责对表中的数据进行提取和写入工作的,我们可以为 不同的表设置不同的存储引擎 ,也就是说不同的表可以有不同的物理存储结构,不同的提取和写入方式。
3.1、创建表时指定存储引擎
如果创建表的语句没有指定表的存储引擎,那就会使用默认的存储引擎 InnoDB 。如果我们想显式的指定一下表的存储引擎,那可以这么写:
CREATE TABLE 表名(
建表语句;
) ENGINE = 存储引擎名称;
3.2、修改表的存储引擎
如果表已经建好了,我们也可以使用下边这个语句来修改表的存储引擎:
ALTER TABLE 表名 ENGINE = 存储引擎名称;
比如我们修改一下 engine_demo_table 表的存储引擎:
ALTER TABLE engine_demo_table ENGINE = InnoDB;
4、引擎介绍
好,到了这里,因为是完全按照大家熟悉的SQL语句先对引擎认识一下,相信大家对于引擎已经有了一点点感觉,如果还没有感觉,没关系,接下来会只挑重点讲:
4.1、InnoDB 引擎:具备外键支持功能的事务存储引擎
MySQL从3.23.34a开始就包含InnoDB存储引擎。 大于等于5.5之后,默认采用InnoDB引擎 。
InnoDB是MySQL的 默认事务型引擎 ,它被设计用来处理大量的短期(short-lived)事务。可以确保事务的完整提交(Commit)和回滚(Rollback)。
除了增加和查询外,还需要更新、删除操作,那么,应优先选择InnoDB存储引擎。
除非有非常特别的原因需要使用其他的存储引擎,否则应该优先考虑InnoDB引擎。
数据文件结构:
(1)表名.frm 存储表结构
(2)表名.ibd 存储数据和索引对比MyISAM的存储引擎, InnoDB写的处理效率差一些 ,并且会占用更多的磁盘空间以保存数据和索引。
MyISAM只缓存索引,不缓存真实数据;InnoDB不仅缓存索引还要缓存真实数据, 对内存要求较高 ,而且内存大小对性能有决定性的影响。
4.2、MyISAM 引擎:主要的非事务处理存储引擎
- MyISAM提供了大量的特性,包括全文索引、压缩、空间函数(GIS)等,但MyISAM 不支持事务、行级锁、外键 ,有一个毫无疑问的缺陷就是 崩溃后无法安全恢复 。(这也是因为不支持事务导致的)
- MySQL5.5之前默认的存储引擎
- 优势是访问的 速度快 ,对事务完整性没有要求或者以SELECT、INSERT为主的应用
- 针对数据统计有额外的常数存储。故而 count(*) 的查询效率很高
- 数据文件结构:
(1)表名.frm 存储表结构
(2)表名.MYD 存储数据
(3)表名.MYI 存储索引 - 应用场景:只读应用或者以读为主的业务
4.3、Archive 引擎:用于数据存档
4.4、Memory 引擎:置于内存的表
概述:
Memory采用的逻辑介质是 内存 , 响应速度很快 ,但是当mysqld守护进程崩溃的时候 数据会丢失 。另外,要求存储的数据是数据长度不变的格式,比如,Blob和Text类型的数据不可用(长度不固定的)。
主要特征:
- Memory同时 支持哈希(HASH)索引 和 B+树索引 。
- Memory表至少比MyISAM表要 快一个数量级 。(MylSAM比InnoDB要快,但是Memory还要比MylSAM快,因为是直接从内存中读取)
- MEMORY 表的大小是受到限制 的。表的大小主要取决于两个参数,分别是 max_rows 和max_heap_table_size 。其中,max_rows可以在创建表时指定;max_heap_table_size的大小默认为16MB,可以按需要进行扩大。
- 数据文件与索引文件分开存储
- 缺点:其数据易丢失,生命周期短。基于这个缺陷,选择MEMORY存储引擎时需要特别小心。
Memory存储引擎的使用场景:
- 目标数据比较小 ,而且非常 频繁的进行访问 ,在内存中存放数据,如果太大的数据会造成 内存溢出 。可以通过参数 max_heap_table_size 控制Memory表的大小,限制Memory表的最大的大小。
- 如果 数据是临时的 ,而且 必须立即可用 得到,那么就可以放在内存中。
- 存储在Memory表中的数据如果突然间 丢失的话也没有太大的关系 。
4.5、其他引擎
MySQL存储引擎还有:
- Blackhole 引擎:丢弃写操作,读操作会返回空内容
- CSV 引擎:存储数据时,以逗号分隔各个数据项
- Federated 引擎:访问远程表
- Merge引擎:管理多个MyISAM表构成的表集合
- NDB引擎:MySQL集群专用存储引擎
这些都不常用,但也列出一下,感兴趣的小伙伴可以单独去了解一下哦。
MyISAM和InnoDB的对比
MySQL5.5之前的默认存储引擎是MyISAM,5.5之后改为了InnoDB。
MySQL中同一个数据库,不同的表可以选择不同的存储引擎。而在实际场景中,用的最多的两个引擎就是MylSAM和InnoDB了。这里有一个点需要注意,并不是说InnoDB作为MySQL5.5之后的默认引擎就一定比MylSAM引擎要好,并不存在说InnoDB就是来替代MyISAM的,这两者更倾向于一个互补的关系。
对比项 | MylSAM | InnoDB |
---|---|---|
外键 | 不支持 | 支持 |
事务 | 不支持 | 支持 |
行表锁 | 表锁,即使操作一条记录也会锁住整个表,不适合高并发的操作 | 行锁,操作时只锁某一行,不对其它行有影响,适合高并发的操作 |
缓存 | 只缓存索引,不缓存真实数据 | 不仅缓存索引还要缓存真实数据,对内存要求较高,而且内存大小对性能有决定性的影响 |
自带系统表使用 | Y | N |
关注点 | 性能:节省资源、消耗少、适用于简单业务 | 事务、并发写、更大资源 |
默认安装 | Y | Y |
默认使用 | N | Y |
总结
如果有哪些写的不对的地方,望各位指出,感谢。
边栏推荐
- Redis集群方案应该怎么做?都有哪些方案?
- Popularization of security knowledge - twelve moves to protect mobile phones from network attacks
- How can I take a shortcut to learn C language in college
- 学习单片机对社会的帮助是很大的
- Several silly built-in functions about relative path / absolute path operation in CAPL script
- MySQL ERROR 1040: Too many connections
- Routes and resources of AI
- C杂讲 动态链表操作 再讲
- Sichuan cloud education and double teacher model
- Contest3145 - the 37th game of 2021 freshman individual training match_ B: Password
猜你喜欢
寶塔的安裝和flask項目部署
Combined search /dfs solution - leetcode daily question - number of 1020 enclaves
在CANoe中通過Panel面板控制Test Module 運行(初級)
C杂讲 动态链表操作 再讲
大学想要选择学习自动化专业,可以看什么书去提前了解?
Cmooc Internet + education
C miscellaneous lecture continued
软件测试工程师必备之软技能:结构化思维
Contrôle de l'exécution du module d'essai par panneau dans Canoe (primaire)
C#/. Net phase VI 01C Foundation_ 01: running environment, process of creating new C program, strict case sensitivity, meaning of class library
随机推荐
There are software load balancing and hardware load balancing. Which one to choose?
Redis distributed lock implementation redison 15 questions
听哥一句劝,按这套嵌入式的课程内容和课程体系去学习
单片机如何从上电复位执行到main函数?
Installation of pagoda and deployment of flask project
Why is 51+ assembly in college SCM class? Why not come directly to STM32
AI的路线和资源
I2C summary (single host and multi host)
jar运行报错no main manifest attribute
嵌入式开发中的防御性C语言编程
C杂讲 文件 初讲
MySQL实战优化高手04 借着更新语句在InnoDB存储引擎中的执行流程,聊聊binlog是什么?
Flash operation and maintenance script (running for a long time)
零基础学习单片机切记这四点要求,少走弯路
What you have to know about network IO model
软件测试工程师必备之软技能:结构化思维
嵌入式开发比单片机要难很多?谈谈单片机和嵌入式开发设计经历
Canoe cannot automatically identify serial port number? Then encapsulate a DLL so that it must work
西南大学:胡航-关于学习行为和学习效果分析
Vscode common instructions