当前位置: 首页 > news >正文

MySQL常见的两种存储引擎:MyISAM与InnoDB的爱恨情仇

Java面试通关手册(Java学习指南,欢迎Star,会一直完善下去,欢迎建议和指导):https://github.com/Snailclimb/Java_Guide

一 MyISAM

1.1 MyISAM简介

MyISAM是MySQL的默认数据库引擎(5.5版之前),由早期的 ISAM (Indexed Sequential Access Method:有索引的顺序访问方法)所改良。虽然性能极佳,而且提供了大量的特性,包括全文索引、压缩、空间函数等,但MyISAM不支持事务和行级锁,而且最大的缺陷就是崩溃后无法安全恢复。不过,5.5版本之后,MySQL引入了InnoDB(另一种数据库引擎)。

下面这张图只是想表达的意思是现在大多数时候我们使用的都是InnoDB存储引擎,但是在某些情况下使用MyISAM更好,比如:MyISAM更适合读密集的表,而InnoDB更适合写密集的的表。 在数据库做主从分离的情况下,经常选择MyISAM作为主库的存储引擎。
5.5版本之后,MySQL引入了InnoDB

1.2 MyISAM特点

  • 不支持行锁(MyISAM只有表锁),读取时对需要读到的所有表加锁,写入时则对表加排他锁;
  • 不支持事务
  • 不支持外键
  • 不支持崩溃后的安全恢复
  • 在表有读取查询的同时,支持往表中插入新纪录
  • 支持BLOB和TEXT的前500个字符索引,支持全文索引
  • 支持延迟更新索引,极大地提升了写入性能
  • 对于不会进行修改的表,支持 压缩表 ,极大地减少了磁盘空间的占用

补充概念:

Mysql的行锁和表锁( 锁是计算机协调多个进程或纯线程并发访问某一资源的机制)
表级锁: 每次操作锁住整张表。开销小,加锁快;不会出现死锁;锁定粒度大,发生锁冲突的概率最高,并发度最低;
行级锁: 每次操作锁住一行数据。开销大,加锁慢;会出现死锁;锁定粒度最小,发生锁冲突的概率最低,并发度也最高;

二 InnoDB

2.1 MyISAM简介

InnoDB是MySQL的默认数据库引擎(5.5版之后),2006年五月时由甲骨文公司并购。与传统的ISAM与MyISAM相比,InnoDB的最大特色就是支持了ACID兼容的事务(Transaction)功能。

2.2 MyISAM特点

  • 支持行锁,采用MVCC来支持高并发,有可能死锁
  • 支持事务
  • 支持外键
  • 支持崩溃后的安全恢复
  • 不支持全文索引

三 关于二者的对比与总结

3.1 二者的常见对比

1) count运算上的区别: 因为MyISAM缓存有表meta-data(行数等),因此在做COUNT(*)时对于一个结构很好的查询是不需要消耗多少资源的。而对于InnoDB来说,则没有这种缓存。

2) 是否支持事务和崩溃后的安全恢复: MyISAM 强调的是性能,每次查询具有原子性,其执行数度比InnoDB类型更快,但是不提供事务支持。但是InnoDB 提供事务支持事务,外部键等高级数据库功能。 具有事务(commit)、回滚(rollback)和崩溃修复能力(crash recovery capabilities)的事务安全(transaction-safe (ACID compliant))型表。

3)是否支持外键: MyISAM不支持,而InnoDB支持。

3.2 总结

MyISAM更适合读密集的表,而InnoDB更适合写密集的的表。 在数据库做主从分离的情况下,经常选择MyISAM作为主库的存储引擎。

一般来说,如果需要事务支持,并且有较高的并发读取频率(MyISAM的表锁的粒度太大,所以当该表写并发量较高时,要等待的查询就会很多了),InnoDB是不错的选择。如果你的数据量很大(MyISAM支持压缩特性可以减少磁盘的空间占用),而且不需要支持事务时,MyISAM是最好的选择。

欢迎关注我的微信公众号:" Java面试通关手册"(一个有温度的微信公众号,无广告,单纯技术分享,期待与你共同进步~~~坚持原创,分享美文,分享各种Java学习资源)

最后,就是使用阿里云服务器一段时间后,感觉阿里云真的很不错,就申请做了阿里云大使,然后这是我的优惠券地址.

相关文章:

  • 『TensorFlow』线程控制器类变量作用域
  • Git漏洞导致攻击者可在用户电脑上运行任意代码
  • [译] 不用祖传秘方 - 写好代码的几个小技巧
  • el-input获取焦点 input输入框为空时高亮 el-input值非法时
  • 安装Cassandra数据库和访问客户端配置
  • CSS中background-position使用技巧
  • java调用IPFS去中心化体系
  • Scrapy 1.5.0之基础入门
  • OSChina 周一乱弹 —— 你老婆和闺蜜总用奇怪的眼神看着你
  • Linux 进程后台运行的几种方式 screen
  • ES6系列--4. 对象的扩展
  • 技术沙龙|风口之下,经验丰富的“传统开发者”要不要转型区块链开发?(西安)...
  • 中兴智能视觉大数据报道:至2020年人脸识别市场规模增速为166.6%
  • nginx lua模块安装 让nginx支持lua
  • 【知识小结】Git 个人学习笔记及心得
  • android高仿小视频、应用锁、3种存储库、QQ小红点动画、仿支付宝图表等源码...
  • CentOS 7 防火墙操作
  • Eureka 2.0 开源流产,真的对你影响很大吗?
  • JAVA之继承和多态
  • PHP的Ev教程三(Periodic watcher)
  • Spring核心 Bean的高级装配
  • Swift 中的尾递归和蹦床
  • 从0实现一个tiny react(三)生命周期
  • 大快搜索数据爬虫技术实例安装教学篇
  • 原生js练习题---第五课
  • 看到一个关于网页设计的文章分享过来!大家看看!
  • media数据库操作,可以进行增删改查,实现回收站,隐私照片功能 SharedPreferences存储地址:
  • # Python csv、xlsx、json、二进制(MP3) 文件读写基本使用
  • #中国IT界的第一本漂流日记 传递IT正能量# 【分享得“IT漂友”勋章】
  • (11)工业界推荐系统-小红书推荐场景及内部实践【粗排三塔模型】
  • (8)Linux使用C语言读取proc/stat等cpu使用数据
  • (C)一些题4
  • (翻译)Entity Framework技巧系列之七 - Tip 26 – 28
  • (附源码)spring boot校园健康监测管理系统 毕业设计 151047
  • (附源码)计算机毕业设计SSM疫情居家隔离服务系统
  • (六) ES6 新特性 —— 迭代器(iterator)
  • (免费领源码)Java#ssm#MySQL 创意商城03663-计算机毕业设计项目选题推荐
  • (一)80c52学习之旅-起始篇
  • (转)iOS字体
  • (转)程序员技术练级攻略
  • (转)程序员疫苗:代码注入
  • (转载)虚幻引擎3--【UnrealScript教程】章节一:20.location和rotation
  • .[hudsonL@cock.li].mkp勒索病毒数据怎么处理|数据解密恢复
  • .NET Core Web APi类库如何内嵌运行?
  • .net core 连接数据库,通过数据库生成Modell
  • .NET Core跨平台微服务学习资源
  • .net mvc 获取url中controller和action
  • .net 使用ajax控件后如何调用前端脚本
  • .net2005怎么读string形的xml,不是xml文件。
  • .NetCore实践篇:分布式监控Zipkin持久化之殇
  • .NET框架类在ASP.NET中的使用(2) ——QA
  • .NET与java的MVC模式(2):struts2核心工作流程与原理
  • .xml 下拉列表_RecyclerView嵌套recyclerview实现二级下拉列表,包含自定义IOS对话框...
  • @synthesize和@dynamic分别有什么作用?
  • @开发者,一文搞懂什么是 C# 计时器!