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 InnoDB简介

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

2.2 InnoDB特点

  • **支持行锁**,采用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是最好的选择。

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

编辑于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏数据库

记一次排查DB死锁的分析

文章摘要 在线上环境遇到数据库死锁问题该如何分析并解决问题呢? 虽然很多童鞋在学数据库课程时都了解数据库隔离级别、死锁和事务等概念,但在测试/线上环境遇到死锁却...

1968
来自专栏杨建荣的学习笔记

MySQL误操作数据恢复的简单实践(r11笔记第67天)

前几天有个同事碰到了一个MySQL数据恢复的问题,他运行了一条update语句,结果忘记了加where条件,结果等反应过来已经晚了。我简单确认了下,是否...

3769
来自专栏携程技术中心

干货 | 一个MySQL 5.7 分区表性能下降的案例分析

作者简介 姜宇祥,2012年加入携程,10年数据库核心代码开发经验,相关开发涉及达梦,MySQL数据库。现致力于携程MySQL的底层研发,为特殊问题定位和处理提...

4087
来自专栏杨建荣的学习笔记

索引列顺序导致的性能问题

今天和大家分享一个很有意思的例子,关于索引列的顺序导致的性能问题。 发现数据库的性能比较差,CPU消耗很高,抓了一个awr,发现瓶颈在sql上,top 1的sq...

3545
来自专栏Linyb极客之路

MySQL锁

  MySQL的锁机制,就是数据库为了保证数据的一致性而设计的面对并发场景的一种规则。

431
来自专栏用户画像

mysql 模拟试题一

  3.SQL语言的数据操纵语句包括 SELECT,INSERT,UPDATE和 DELETE, 最重要的,也是使用最频繁的语句是__A__。 

854
来自专栏WindCoder

网易MySQL微专业学习笔记(二)-Mysql数据对象

这个系列属于个人学习网易云课堂MySQL数据库工程师微专业的相关课程过程中的笔记,本篇为其“MySQL数据库对象与应用”中的MySQL数据类型相关笔记。

491
来自专栏L宝宝聊IT

索引、视图、存储过程和触发器的应用

1478
来自专栏运维

zabbix2.4.5迁移到zabbix3.0

http://qicheng0211.blog.51cto.com/3958621/1744603

1053
来自专栏Java技术交流群809340374

MySQL有哪些存储引擎,各自的优缺点,应用场景

经常面试都会问到MYSQL有哪些存储引擎,以及各自的优缺点。今天主要分享常见的存储引擎:MyISAM、InnoDB、MERGE、MEMORY(HEAP)、BDB...

1183

扫码关注云+社区