作为一名软件开发者,对于mysql数据库,或多或少都会有所了解。
张工是一名程序员,有3年多开发经验,这3年主要是做java后端开发的,有次到广州一家软件公司应聘java开发岗位,面试官问了他这样一个问题:
你知道在MySQL数据库中MyISAM和InnoDB有什么区别吗?
面试官问他这个问题也不是随便问的,面试是看了张工的简历写着熟悉mysql才提问的。
其实对于mysql,张工平时也只是简单地用mysql建表,然后往数据表里写数据,查数据这样的简单操作,而没有去了解建表的原理。
对于这个问题,张工一下子也不知道两者到底有什么区别,于是直接回复他,“不知道”。
谁知面试官“你都工作3年了,怎么连MyISAM和InnoDB有什么区别都不知道?”
被面试官这么一说,张工都有些不好意思了。都怪自己平时做项目时只知道完成任务,而没有去了解其原理。
从张工这次面试,也给我们敲了下警钟,对于有些技术知识点,要是没有掌握,建议简历上不要写熟悉之类的,如果真要写,建议用了解这样的字样来描述。避免面试官问起时回答不出来,暴露了自己的不足。
那么在mysql数据库中MyISAM和InnoDB两者有什么区别呢,我们来简单了解下。
首先我们来看看我们自己正在使用的数据库采用的是什么引擎?
我们可以用下面的命令查看:
SHOWENGINES;
从中我们可以看出mysql数据库为我们提供了非常多的存储引擎,从表中看出,InnoDB的Support列是DEFAULT,这就说明你正在使用的数据库服务器上,InnoDB是默认的数据库引擎,不过MySQL对于多引擎有很好的兼容,一个数据库服务器上不同的数据库完全可以使用不同的数据引擎,甚至一个数据库中的多个表也可以使用不同的引擎。
下面我们来看看MyISAM和InnoDB两者有什么区别?
MyISAM
不支持事务,所以每次查询都是原子的;
支持表级锁,即每次操作是对整个表加锁;
存储表的总行数;
一个MYISAM表有三个文件:索引文件、表结构文件、数据文件;
采用非聚集索引(Non-clustered),索引文件的数据域存储指向数据文件的指针。
InnoDb
支持ACID的事务;
支持行级锁及外键约束;
不存储总行数;
一个InnoDb引擎存储在一个文件空间(共享表空间,表大小不受操作系统控制,一个表可能分布在多个文件里),也有可能为多个,受操作系统文件大小的限制;
主键索引采用聚集索引(索引的数据域存储数据文件本身),辅索引的数据域存储主键的值;因此从辅索引查找数据,需要先通过辅索引找到主键值,再访问辅索引;使用自增主键,防止插入数据时,为维持B+树结构,文件的大调整。
总结
作为一名程序员,平时在使用一些知识点时,建议要了解其原理,而不是停留在只会用的层面,需要了解InnoDB和MyISAM在使用上的区别,如果有兴趣,还有必要深入研究为什么会有哪些区别的话,这就需要了解其底层的实现原理,以及对B+树有一定的了解。
如果你比较清晰地了解其背后的原理概要了,那么和面试官交流起来就会很舒服了,相信能为这次面试加分,被录用的概率就大大提高了。
由于笔者知识及水平有限,文中错漏之处在所难免,如有不足之处,欢迎交流。