面试官:请你讲一下InnoDB和MyISAM的区别?(用于复习)
我是
方圆
,希望这些知识对我们有帮助!
浏览和索引
InnoDB | MyISAM |
---|---|
支持事务 | 支持事务(下方解释) |
支持 外键 |
不支持 外键 |
支持行锁
|
不支持行锁,支持表锁
|
写 操作效率高 |
读 操作效率高(执行大量读的操作,是很不错的选择) |
支持 全文索引 |
支持 全文索引 |
表占用空间较小
|
表占用空间较大
|
聚集索引 | 非聚集索引 |
1. 解释全网说的最多的MyISAM不支持索引问题
- 摘自《高性能MySQL》
InnoDB
:MySQL默认的事务型引擎,也是最重要和使用最广泛的存储引擎。它被设计成为大量的短期事务,短期事务大部分情况下是正常提交的,很少被回滚。InnoDB的性能与自动崩溃恢复的特性,使得它在非事务存储需求中也很流行。除非有非常特别的原因需要使用其他的存储引擎,否则应该优先考虑InnoDB引擎。MyISAM
:在MySQL 5.1 及之前的版本,MyISAM是默认引擎。MyISAM提供的大量的特性,包括全文索引、压缩、空间函数(GIS)等,但MyISAM并不支持事务以及行级锁,而且一个毫无疑问的缺陷是崩溃后无法安全恢复。正是由于MyISAM引擎的缘故,即使MySQL支持事务已经很长时间了,在很多人的概念中MySQL还是非事务型数据库。尽管这样,它并不是一无是处的。对于只读的数据,或者表比较小,可以忍受修复操作,则依然可以使用MyISAM(但请不要默认使用MyISAM,而是应该默认使用InnoDB)
2. MyISAM与InnoDB表锁和行锁的解释
在MySQL中,表级锁有两种模式:表共享读锁
,表独占写锁
。也就是说对于MyISAM引擎的表
,多个用户可以对同一个表发起读的请求
,但是如果一个用户对表进行写操作
,那么则会阻塞
其他用户对这个表的读和写。InnoDB引擎的表
是通过索引项来加锁实现的,即只有通过索引条件检索数据的时候,InnoDB才会使用行级锁,否则也会使用表级锁。
3. 在物理空间的存储
所有数据库的文件都在data目录下,一个文件夹对应一个数据库,本质是文件的存储
InnoDB
在数据库中只存在一个*.frm文件,以及上级目录下的ibdata文件MyISAM
在磁盘上存储成三个文件
- *.frm(存储表定义)
- MYD(MyData,数据文件)
- MYI(MyIndex,索引文件)
4. 是否保存数据库表中表的具体行数
InnoDB 中不保存表的具体行数
,也就是说,执行select count(*) from table 时,InnoDB要扫描一遍整个表来计算有多少行,但是MyISAM
只要简单的读出保存好的行数
即可。