请你讲一下InnoDB和MyISAM的区别

「这是我参与11月更文挑战的第8天,活动详情查看:2021最后一次更文挑战


我是方圆,希望这些知识对我们有帮助!

InnoDB MyISAM
支持事务 不支持事务
支持外键 不支持外键
支持行锁 不支持行锁,支持表锁
操作效率高 操作效率高(执行大量读的操作,是很不错的选择)
支持全文索引 支持全文索引
表占用空间较小 表占用空间较大
聚集索引 非聚集索引

1. MyISAM不支持事务,书摘

  • 摘自《高性能MySQL》

InnoDB:MySQL默认的事务型引擎,也是最重要和使用最广泛的存储引擎。它被设计成为大量的短期事务,短期事务大部分情况下是正常提交的,很少被回滚。InnoDB的性能与自动崩溃恢复的特性,使得它在非事务存储需求中也很流行。除非有非常特别的原因需要使用其他的存储引擎,否则应该优先考虑InnoDB引擎。 MyISAM:在MySQL 5.1 及之前的版本,MyISAM是默认引擎。MyISAM提供的大量的特性,包括全文索引、压缩、空间函数(GIS)等,但MyISAM并不支持事务以及行级锁,而且一个毫无疑问的缺陷是崩溃后无法安全恢复。

2. MyISAM与InnoDB表锁和行锁的解释

在MySQL中,表级锁有两种模式:表共享读锁表独占写锁。也就是说对于MyISAM引擎的表多个用户可以对同一个表发起读的请求,但是如果一个用户对表进行写操作,那么则会阻塞其他用户对这个表的读和写。 InnoDB引擎的表是通过索引项来加锁实现的,即只有通过索引条件检索数据的时候,InnoDB才会使用行级锁,否则也会使用表级锁。

3. 在物理空间的存储

所有数据库的文件都在data目录下,一个文件夹对应一个数据库,本质是文件的存储 InnoDB在数据库中只存在一个*.frm文件,以及上级目录下的ibdata文件 MyISAM在磁盘上存储成三个文件

  1. *.frm(存储表定义)
  2. MYD(MyData,数据文件)
  3. MYI(MyIndex,索引文件)

4. 是否保存数据库表中表的具体行数

InnoDB 中不保存表的具体行数,也就是说,执行select count(*) from table 时,InnoDB要扫描一遍整个表来计算有多少行,但是MyISAM只要简单的读出保存好的行数即可。

猜你喜欢

转载自juejin.im/post/7031400594304663560