数据库老司机的MySQL面试宝典:自我介绍与技术问答

数据库老司机的MySQL面试宝典:自我介绍与技术问答

面试就是一个检验自己学习水平的平台,笔者一直从事数据库相关的培训工作,总是会遇到有些学生平时学得很好,而且掌握知识的能力也很强,但一去面试就发挥不出自己应有的水平,薪资也自然达不到自己的预期。学生给我的反馈就是看见那些面试官就胆怯,一问问题就不知道该说些什么,之前学过的那些知识也自然就忘得一干二净了。

其实对于我们这些做技术的人来说,学习能力固然很重要,但更为重要的是要有一个良好的心态。作为DBA,今后可能都会遇到误删数据、服务器宕机,以及各种疑难故障问题,这些状况就跟家常便饭一样。如果没有一颗大心脏,那么遇到一点困难,就会自己慌了神,感觉手足无措,不知道该如何下手。这些心态上的问题,需要有一个克服的过程。

不管遇到什么问题,要相信MySQL数据库没有那么脆弱,更要相信自己的能力,把自己所学的所有知识都轻松地展现出来就好。拥有一颗平常心在工作和面试中就显得格外重要了。

数据库老司机的MySQL面试宝典:自我介绍与技术问答

自我介绍

在自我介绍中有三个要素一定要知晓。

  • 第一个就是要有自我认知的能力

意思是就是要对自己有个全方位的认识,可以从自己的过往工作经历来介绍自己,不要觉得简历上都写清楚了,为什么还非得再说一遍呢?面试官看重的东西其实很简单,主要就看你对这次面试的重视程度,你连自我介绍都可以漫不经心,那对交给你工作的态度更是需要打个问号了。短短的几分钟聊天就能让对方对你有个大致的认识,所以耐心地介绍一遍自己的履历并不是什么难事。大多数面试官最喜欢问上家公司的一些事情,你就可以从上一家公司所处理过的事情中抽出一件印象深刻的来讲给他听,营造一种轻松的聊天氛围,既可以让自己紧张的心情放松下来,又会给自己整个的面试过程加不少分。当然这都是要建立在真诚的基础上。

  • 第二点就是对岗位的认知能力

在各大招聘网站上我们都会看到对某一岗位的职责描述,比如作为DBA,我们要掌握优化数据库性能瓶颈的本领。你就可以从之前所处理过的优化案列中找出一件,阐述给面试官在你遇到数据库某一性能瓶颈问题时,如何屡清优化思路,利用资源进行相应的优化操作来解决问题。这种阐述就是一种推销自己的面试,可以让面试官快速从众多竞聘者中记住你,也会向高层介绍你突出的处理问题的能力,间接说明你很适合当前这个岗位。

  • 第三点就是分清主次,捡重要的说

在面试中我们先要学会听清对方所提问的问题,不要在不了解问题的基础上畅所欲言。而且在回答问题时,要学会摸清对方的心理,捡重点来阐述。面试官看重的是你是否是一个有大局观、测分清主次的人。今后当你向领导汇报问题时,可以协助领导以最快的速度了解目前的现状,早下决策。

以上就是自我介绍的三点要素,希望可以让大家重新重视起面试中自我介绍的重要性。机会永远留给有准备的人。

数据库老司机的MySQL面试宝典:自我介绍与技术问答

除了自我介绍的重要性,面试官可能还会对你的过往经历比较感兴趣,看看你每段工作的时间,是否是那种频繁跳槽的人。一些人认为频繁跳槽可以开拓视野,让自己多角度思考问题,年轻人就得折腾,多经历一些事情不是坏事。但作为DBA的我们,一定要不忘初心,牢记使命!维护公司核心数据库的安全与业务的稳定性是我们最核心的任务。如果出现经常跳槽的现象,是没有公司敢要你的,技术更新换代很迅速,而且学习的过程是需要积累与沉淀的,跳槽太多不利于你静下心来深入研究技术知识,你可能永远停留在最初级的阶段,那么很多优秀的岗位、诱惑的薪资都将与你擦肩而过。所以作者希望在数据库领域的这些年轻人,不要太浮躁,踏实做事认真做人,稳步前行。

最后也可以谈谈你对未来进入公司之后的一些计划。这个可以从比较专业的角度去阐述。可以先简单了解一下公司现有业务模式(面试之前就要做好功课),提出相关在此业务模式基础之上数据库架构设计方案的建议。针对创业型公司,我们也可以谈针对未来组建运维、数据库团队的规划,让面试官看到你加入公司的决心。

数据库老司机的MySQL面试宝典:自我介绍与技术问答

技术面试十问十答

上面说了这么多,都是从非技术的角度去了解面试中的一些环节和注意事项。接下来我们从专业的技术角度总结一下在MySQL DBA面试过程中,最常被问及的一些技术问题。这里总结了10个问题及其相关解答思路,方便大家在今后的面试中,可以非常顺利地通过技术面试,得到自己期望中的高薪资。

问题 1:你目前接触的MySQL版本是什么?除了官方版本,还接触过其他的MySQL分支版本吗?

解答思路:首先可以谈谈产生分支的原因。许多开发人员认为有必要将其拆分成其他项目,并且每个分支项目都有自己的专长。该需求和Oracle对核心产品增长缓慢的担忧,导致出现了许多开发人员感兴趣的子项目和分支。

介绍一下三个流行的MySQL分支:Drizzle、MariaDB和Percona Server(包括XtraDB引擎)。

更细节化展开说明各个分支的特点。MariaDB不仅是MySQL的替代品,主要是创新和提高了MySQL自有技术。新功能介绍如下:multi-source replication 多源复制、表的并行复制(MySQL 5.7版本中也加入该特性)、galera cluster集群、spider水平分片和TokuDB存储引擎。

XtraDB是InnoDB存储引擎的增强版,可用来更好地发挥最新的计算机硬件系统性能,还包含在高性能模式下的新特性。它可以向下兼容,因为它是在InnoDB基础上构建的,所以有更多的指标和扩展功能。而且它在CPU多核的条件下,可以更好地使用内存,将数据库性能提到更高。

Drizzle与MySQL的差别就比较大了,并且不能兼容,如果想运行此环境,就需要重写一些代码了。

问题 2 :MySQL主要的存储引擎MyISAM和InnoDB的不同之处?

解答思路:可以从五个方向去介绍。事务的支持不同(InnoDB支持事务、MyISAM不支持事务);锁粒度(InnoDB行锁应用、MyISAM表锁);存储空间(InnoDB既缓存索引文件,又缓存数据文件,MyISAM只能缓存索引文件);存储结构(MyISAM:数据文件的扩展名为.MYD myData,索引文件的扩展名是.MYI myIndex;InnoDB:所有的表都保存在同一个数据文件里面,即.Ibd);统计记录行数(MyISAM:保存有表的总行数,select count(*) from table会直接取出该值;InnoDB:没有保存表的总行数,select count(*) from table会遍历整个表,消耗相当大)。

问题 3 :介绍一下InnoDB的体系结构

解答思路:谈及InnoDB的体系结构,首先要考虑MySQL的体系结构,分为MySQL的server层和存储引擎层两部分。

先要跟面试官聊清楚MySQL的整体方向,然后再去涉及InnoDB体系结构。建议从三方面介绍InnoDB体系结构:内存、线程、磁盘。

内存中包含insert_buffer、data_buffer、index_buffer、redo_log_buffer、double_write。

内存刷新到磁盘的机制:redo log buffer、脏页、binlog cache的刷新条件。

各种线程的作用:master_thread、purge_thread、redo log thread、read thread、write thread、page cleaner thread。

磁盘中存放的数据文件:redo log、undo log、binlog。

问题 4 :MySQL有哪些索引类型?

解答思路:可以从三个角度去谈。首先从数据结构角度上可以分为B+tree索引、hash索引、fulltext索引(InnoDB、MyISAM都支持)。

其次从存储角度上可以分为聚集索引和非聚集索引。

最后从逻辑角度上可以分为primary key、normal key、单列、复合和覆盖索引。

问题 5:MySQL binlog有几种格式?生产中你用哪种?各自有什么特点?

解答思路:可以对各种格式的优缺点分别介绍。

第一种,statement格式。

优点:不需要记录每一行的变化,减少了binlog日志量,节约了I/O,提高了性能。

缺点:当使用一些特殊函数,或者跨库操作时容易丢失数据。

注:在生产中不建议使用。

第二种,row格式。

优点:清晰记录每行的数据信息,不会出现跨库丢数据的情况,安全性非常高。

缺点:当内容记录到日志中时,都将以每行的修改来记录,会产生大量的binlog,网络开销也比较大。

注:生产中推荐使用。

第三种,mixed格式。

MySQL 5.1的一个过渡版本,DDL语句会记录成statement,DML会记录成row。

注:生产中不建议使用。

问题6:MySQL主从复制的具体原理是什么?

解答思路:直接阐述原理即可,表达一定要清楚。主服务器把数据更新记录到二进制日志中,从服务器通过I/O thread向主库发起binlog请求,主服务器通过I/O dump thread把二进制日志传递给从库,从库通过I/O thread记录到自己的中继日志中。然后通过SQL thread应用中继日志中SQL的内容。

问题7:数据库中的双一是什么?

解答思路:遇到这样的问题,可以从两个参数着手分析。一个是sync_binlog=1,另一个就是innodb_flush_log_at_trx_commit=1。

innodb_flush_log_at_trx_commit和sync_binlog两个参数是控制MySQL 磁盘写入策略以及数据安全性的关键参数。

innodb_flush_log_at_trx_commit设置为1,每次事务提交时,MySQL都会把log buffer的数据写入log file,并且刷到磁盘中。

sync_binlog =N(N > 0),MySQL在每写N次二进制日志binary log时,会使用fdatasync()函数将它的写二进制日志binary log同步到磁盘中。

问题8:如何实施大表DDL语句才能把性能影响降到最低?

解答思路:我们可以先通过传统方法导入/导出数据,新建一张与原表一样的表结构,把需要执行的DDL语句在无数据的新表中执行,然后把老表中的数据导入到新表中,最后把新表改成老表的名字。

也可以通过第三方工具(percona-toolkit)中的pt-online-schema-change命令进行在线操作,但对于MySQL 5.7版本可以直接在线“online ddl”。

还可以介绍一下MySQL对大表进行drop table操作时,可以对数据文件建立硬连接,这样可以缩短执行时间。依赖的原理:OS HARD LINK。当多个文件名同时指向同一个INODE时,这个INODE的引用数N > 1,删除其中任何一个文件名只是删除了一个指针,不会删除数据文件。当INODE的引用数N=1时,删除文件时需要把这个文件相关的所有数据块清除,所以会比较耗时。

问题9:为什么要为InnoDB表设置自增列做主键?

解答思路:使用自增列做主键,写入顺序是自增的,和B+数叶子节点分裂顺序一致。InnoDB表的数据写入顺序能和B+树索引的叶子节点顺序一致时,存取效率是最高的。

问题10:如何优化一条慢SQL语句?

解答思路:针对SQL语句的优化,我们不要一上来就回答添加索引,这样显得太不专业。我们可以从如下几个角度去分析:

(1)回归到表的设计层面,数据类型选择是否合理。

(2)大表碎片的整理是否完善。

(3)表的统计信息是不是准确的。

(4)审查表的执行计划,判断字段上面有没有合适的索引。

(5)针对索引的选择性,建立合适的索引(就又涉及大表DDL的操作问题。所以说,我们要有能力把各个知识点联系起来)。


本文选自《MySQL王者晋级之路》

数据库老司机的MySQL面试宝典:自我介绍与技术问答

本书深入剖析MySQL数据库体系结构,实战演练备份恢复、主从复制,详解高可用集群架构的设计与实践过程,详细梳理优化思路,展现新版本的特性,并与真实生产案例相结合,通过核心原理到“王者”实战,全面覆盖MySQL数据库的知识点。

了解本书详情:https://item.jd.com/12331872.html


分享到:


相關文章: