阿里P8架构师谈:MySQL有哪些存储引擎,各自的优缺点,应用场景
经常面试都会问到MYSQL有哪些存储引擎,以及各自的优缺点。今天主要分享常见的存储引擎:MyISAM、InnoDB、MERGE、MEMORY(HEAP)、BDB(BerkeleyDB)等,以及最常用的MyISAM与InnoDB两个引擎 ,文章尾部有两者的详细比较。
MySQL常用存储引擎介绍
1.InnoDB 引擎(MySQL5.5以后默认使用)
MySQL 5.5 及以后版本中的默认存储引擎,他的优点如下:
- 灾难恢复性好
- 支持事务
- 使用行级锁
- 支持外键关联
- 支持热备份
- 对于InnoDB引擎中的表,其数据的物理组织形式是簇表(Cluster Table),主键索引和数据是在一起的,数据按主键的顺序物理分布
- 实现了缓冲管理,不仅能缓冲索引也能缓冲数据,并且会自动创建散列索引以加快数据的获取
- 支持热备份
2.MyISAM引擎
特性如下:
- 不支持事务
- 使用表级锁,并发性差
- 主机宕机后,MyISAM表易损坏,灾难恢复性不佳
- 可以配合锁,实现操作系统下的复制备份、迁移
- 只缓存索引,数据的缓存是利用操作系统缓冲区来实现的。可能引发过多的系统调用且效率不佳
- 数据紧凑存储,因此可获得更小的索引和更快的全表扫描性能
3.MEMORY 存储引擎
提供内存表,也不支持事务和外键。显著提高访问数据的速度,可用于缓存会频繁访问的、可以重构的数据、计算结果、统计值、中间结果。
缺点如下:
- 使用表级锁,虽然内存访问快,但如果频繁的读写,表级锁会成为瓶颈
- 只支持固定大小的行。Varchar类型的字段会存储为固定长度的Char类型,浪费空间
- 不支持TEXT、BLOB字段。当有些查询需要使用到临时表(使用的也是MEMORY存储引擎)时,如果表中有TEXT、BLOB字段,那么会转换为基于磁盘的MyISAM表,严重降低性能
- 由于内存资源成本昂贵,一般不建议设置过大的内存表,如果内存表满了,可通过清除数据或调整内存表参数来避免报错
- 服务器重启后数据会丢失,复制维护时需要小心
MySQL存储引擎MyISAM与InnoDB如何选择
1.两种存储引擎的大致区别表现在:
1)InnoDB支持事务,MyISAM不支持,这一点是非常之重要。事务是一种高级的处理方式,如在一些列增删改中只要哪个出错还可以回滚还原,而MyISAM就不可以了。
2)MyISAM适合查询以及插入为主的应用,InnoDB适合频繁修改以及涉及到安全性较高的应用
3)InnoDB支持外键,MyISAM不支持
4)从MySQL5.5.5以后,InnoDB是默认引擎
5)InnoDB不支持FULLTEXT类型的索引
6)InnoDB中不保存表的行数,如select count(*) from table时,InnoDB需要扫描一遍整个表来计算有多少行,但是MyISAM只要简单的读出保存好的行数即可。注意的是,当count(*)语句包含where条件时MyISAM也需要扫描整个表。
7)对于自增长的字段,InnoDB中必须包含只有该字段的索引,但是在MyISAM表中可以和其他字段一起建立联合索引。
8)清空整个表时,InnoDB是一行一行的删除,效率非常慢。MyISAM则会重建表。
9)InnoDB支持行锁(某些情况下还是锁整表,如 update table set a=1 where user like ‘%lee%’
有人说MYISAM只能用于小型应用,其实这只是一种偏见。
如果数据量比较大,这是需要通过升级架构来解决,比如分表分库,读写分离,而不是单纯地依赖存储引擎。
现在一般都是选用InnoDB了,主要是MyISAM的全表锁,读写串行问题,并发效率锁表,效率低,MyISAM对于读写密集型应用一般是不会去选用的。
总之:
1.MyISAM类型不支持事务处理等高级处理,而InnoDB类型支持。
2.MyISAM类型的表强调的是性能,其执行速度比InnoDB类型更快,但是不提供事务支持,而InnoDB提供事务支持已经外部键等高级数据库功能。
如果你还想了解mysql的各种锁:表锁、行锁、乐观锁等,可以点击查看:
阿里P8架构师谈:MySQL行锁、表锁、悲观锁、乐观锁的特点与应用
你可能也喜欢:
- 阿里P8架构师谈:MongoDB、Hbase、Redis等NoSQL优劣势、应用场景
- 阿里P8架构师谈:MySQL行锁、表锁、悲观锁、乐观锁的特点与应用
- 阿里P8架构师谈:MySQL数据库的索引原理、与慢SQL优化的5大原则
- 阿里P8架构师谈:MySQL慢查询优化、索引优化、以及表等优化总结
- 去腾讯等BAT面试完的Mysql面试55题总结,含答案大赠送!
- 最全MySQL面试60题和答案
阿里P8架构师谈:MySQL有哪些存储引擎,各自的优缺点,应用场景相关推荐
- 阿里P8架构师谈:什么是缓存雪崩?服务器雪崩的场景与解决方案
什么是应用服务雪崩 雪崩问题 分布式系统都存在这样一个问题,由于网络的不稳定性,决定了任何一个服务的可用性都不是 100% 的.当网络不稳定的时候,作为服务的提供者,自身可能会被拖死,导致服务调用者阻 ...
- 阿里P8架构师谈:流量高峰时期的性能瓶颈有哪些、以及如何来解决
在高并发大量用户的场景,系统一般会面临如下三个挑战: 1. 日益增长的用户数量 2. 日渐复杂的业务 3. 急剧膨胀的数据 这些挑战对于性能优化而言表现为:在保持和降低系统TP95响应时间(指的是将一 ...
- 阿里P8架构师谈(4):流量高峰时期的性能瓶颈有哪些、以及如何来解决
在高并发大量用户的场景,系统一般会面临如下三个挑战: 日益增长的用户数量 日渐复杂的业务 急剧膨胀的数据 这些挑战对于性能优化而言表现为:在保持和降低系统TP95响应时间(指的是将一段时间内的请求响应 ...
- psql where里有自定义函数慢_阿里P8架构师谈:MySQL慢查询优化、索引优化、以及表等优化总结...
MySQL优化概述 MySQL数据库常见的两个瓶颈是:CPU和I/O的瓶颈. CPU在饱和的时候一般发生在数据装入内存或从磁盘上读取数据时候. 磁盘I/O瓶颈发生在装入数据远大于内存容量的时候,如果应 ...
- 阿里P8架构师谈:MySQL慢查询优化、索引优化、以及表等优化总结
MySQL优化概述 MySQL数据库常见的两个瓶颈是:CPU和I/O的瓶颈. CPU在饱和的时候一般发生在数据装入内存或从磁盘上读取数据时候. 磁盘I/O瓶颈发生在装入数据远大于内存容量的时候,如果应 ...
- 阿里P8架构师谈:MySQL行锁、表锁、悲观锁、乐观锁的特点与应用
我们在操作数据库的时候,可能会由于并发问题而引起的数据的不一致性(数据冲突).如何保证数据并发访问的一致性.有效性,是所有数据库必须解决的一个问题,锁的冲突也是影响数据库并发访问性能的一个重要因素,从 ...
- 阿里P8架构师谈:MySQL数据库的索引原理、与慢SQL优化的5大原则
MySQL凭借着出色的性能.低廉的成本.丰富的资源,已经成为绝大多数互联网公司的首选关系型数据库.虽然性能出色,但所谓"好马配好鞍",如何能够更好的使用它,已经成为开发工程师的必修 ...
- 阿里对mysql的优化_阿里P8架构师谈:MySQL慢查询优化、索引优化、以及表等优化总结...
更多内容:https://www.toutiao.com/i6599796228886626829/?tt_from=weixin&utm_campaign=client_share& ...
- 阿里P8架构师谈:Web前端、应用服务器、数据库SQL等性能优化总结
web前端性能优化 Web前端指网站业务逻辑之前的部分,包括: 1.浏览器加载 2.网站视图模型 3.图片服务 4.CDN服务等 主要优化手段有优化浏览器访问,使用反向代理,CDN等. 1.浏览器访问 ...
最新文章
- 吴恩达机器学习笔记 —— 10 神经网络参数的反向传播算法
- [概统]本科二年级 概率论与数理统计 第五讲 二元随机变量
- 数组索引必须为正整数或逻辑值是什么意思_贪心算法:K次取反后最大化的数组和...
- centos 下编译 gcc
- python决策树 value_机器学习 | 算法笔记(四)- 决策树算法以及代码实现
- 《ArcGIS Runtime SDK for Android开发笔记》——离在线一体化技术:离线矢量数据下载...
- 印度智能手机市场Q1出货量同比增长7% 小米蝉联榜首
- 云顶之弈法机器人_云顶之弈:拳头加强机器人,6法机器人主C打法直接火了!...
- OpenSSL历史版本整理
- 详解Autosar Arxml中的CANFD报文及格式
- 三年级语文课外阅读赏析——心田花开
- 计算属性(react)
- HM代码阅读3:AMVP候选填充函数Void TComDataCU::fillMvpCand ()
- Java项目结构及路径
- Hadoop学习环境搭建
- File类(Java)
- html右下角的字数计算,JavaScript_用JS剩余字数计算的代码,先看看HTML代码: textarea name - phpStudy...
- 印度身上中国软件能学什么
- 2023寒假学习注意
- 心得,在工作中学会”忽悠”别人
热门文章
- C# WebBrower1控件提示“该文档已被修改,是否保存修改结果”解决方法 .
- 部署windows服务
- javascript 的参数有长度限制吗?一个细节引起的误区
- 让互联网助小组合作一臂之力
- 使用ASP.net 2.0 的一些新特性
- 在数据库中, 不用max()/min()找出一个列中最大/最小值的记录
- ubuntu 12.04 samba 服务器搭建
- [RK3399 Android7.1] 开启保存上一次重启前日志
- 计算机资产管理,▪ 资产管理
- php三级栏目调用,织梦当前栏目调用二级、三级栏目且栏目高亮解决方法