开发者社区> 流楚丶格念> 正文
阿里云
为了无法计算的价值
打开APP
阿里云APP内打开

Mysql 中 MyISAM 和 InnoDB 的区别有哪些?

简介: Mysql 中 MyISAM 和 InnoDB 的区别有哪些?
+关注继续查看

1. 定义


InnoDB:


InnoDB:MySQL默认的事务型引擎,也是最重要和使用最广泛的存储引擎。


它被设计成为大量的短期事务,短期事务大部分情况下是正常提交的,很少被回滚。InnoDB的性能与自动崩溃恢复的特性,使得它在非事务存储需求中也很流行。除非有非常特别的原因需要使用其他的存储引擎,否则应该优先考虑InnoDB引擎。


MyISAM:


MyISAM:在MySQL 5.5 及之前的版本,MyISAM是默认引擎。


MyISAM提供的大量的特性,包括全文索引、压缩、空间函数(GIS)等,但MyISAM并不支持事务以及行级锁,而且一个毫无疑问的缺陷是崩溃后无法安全恢复。正是由于MyISAM引擎的缘故,即使MySQL支持事务已经很长时间了,在很多人的概念中MySQL还是非事务型数据库。尽管这样,它并不是一无是处的。对于只读的数据,或者表比较小,可以忍受修复操作,则依然可以使用MyISAM(但请不要默认使用MyISAM,而是应该默认使用InnoDB)


2. 区别:


  1. InnoDB 支持事务,MyISAM 不支持事务。这是 MySQL 将默认存储引擎从 MyISAM 变成 InnoDB 的重要原因之一;


  1. InnoDB 支持外键,而 MyISAM 不支持。对一个包含外键的 InnoDB 表转为 MYISAM 会失败;


  1. InnoDB 是聚集索引,MyISAM 是非聚集索引。聚簇索引的文件存放在主键索引的叶子节点上,因此 InnoDB 必须要有主键,通过主键索引效率很高。但是辅助索引需要两次查询,先查询到主键,然后再通过主键查询到数据。因此,主键不应该过大,因为主键太大,其他索引也都会很大。而 MyISAM 是非聚集索引,数据文件是分离的,索引保存的是数据文件的指针。主键索引和辅助索引是独立的。


  1. InnoDB 不保存表的具体行数,执行 select count(*) from table 时需要全表扫描。而MyISAM 用一个变量保存了整个表的行数,执行上述语句时只需要读出该变量即可,速度很快;


  1. InnoDB 最小的锁粒度是行锁,MyISAM 最小的锁粒度是表锁。一个更新语句会锁住整张表,导致其他查询和更新都会被阻塞,因此并发访问受限。


这也是 MySQL 将默认存储引擎从 MyISAM 变成 InnoDB 的重要原因之一;


更详细的介绍可以参考下面的网页:https://segmentfault.com/a/1190000008227211


3. 使用:


  1. 是否要支持事务,如果要请选择 InnoDB,如果不需要可以考虑 MyISAM;


  1. 如果表中绝大多数都只是读查询,可以考虑 MyISAM,如果既有读写也挺频繁,请使用InnoDB。


  1. 系统奔溃后,MyISAM恢复起来更困难,能否接受,不能接受就选 InnoDB;


  1. MySQL5.5版本开始Innodb已经成为Mysql的默认引擎(之前是MyISAM),说明其优势是有目共睹的。如果你不知道用什么存储引擎,那就用InnoDB,至少不会差。


版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
[MySQL FAQ]系列 — 不同的binlog_format会导致哪些SQL不会被记录
[MySQL FAQ]系列 — 不同的binlog_format会导致哪些SQL不会被记录
22 0
simps/mqtt v1.1.2 版本发布,首个支持 MQTT v5.0 协议的 PHP library
在此版本中支持了 auth 类型和上个版本中未支持属性,这也意味着 MQTT v5.0 的协议已经支持完毕,后面的版本也就剩下 Bug 修复和代码优化了
26 0
PG+MySQL第13课
数据库使用者了解数据库的高级功能后,才能在业务场景里面使用,来提升整体的生产效率。
45 0
[MySQL FAQ]系列 — 不同的binlog_format会导致哪些SQL不会被记录
[MySQL FAQ]系列 — 不同的binlog_format会导致哪些SQL不会被记录
93 0
mysql binlog format
mysql binlog format格式及查看
635 0
随笔:MYSQL_BIN_LOG::COND_done 是什么
欢迎关注我的《深入理解MySQL主从原理 32讲 》,如下: 一、问题 是什么 二、找到影响位置 整个寻找过程应该找到key_BINLOG_COND_done这个取值,然后去看他是在那里被定义到相应的mutex/cond上,然后查找mutex/cond的作用即可。
1030 0
MySQL redo log
mysql 5.7.25 innodb redo log
1666 0
mysql binlog_format 适时修改
--mysql允许在session或者global级别动态设置binlog_format的值,做在更新很多行时,可以设置 binlog_format = 'STATEMENT' 以加快数据应...
1135 0
+关注
流楚丶格念
csdn平台优质创作者,51cto TOP博主,360图书馆科技博主,燕山大学目前大三在读,日拱一卒,功不唐捐,加油!!!
1010
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
低代码开发师(初级)实战教程
立即下载
阿里巴巴DevOps 最佳实践手册
立即下载
冬季实战营第三期:MySQL数据库进阶实战
立即下载