今天去的这家是一个做棋牌游戏的公司。
规模在300多人,其中大约200人在海外。
今天负责面试的面试官人就在海外,我们是通过微信语音进行交谈的。
没有面对面,少了眼神交流,多了思考的时间。
简单做了一个简短的自我介绍之后,就直入主题,开始技术面试。
面试官:我看你简历上MySQL和Oracle的工作时间差不多,你可以大概讲一下,你做过的MySQL项目和Oracle项目吗?
我:嗯,好的。MySQL的那份,当时的项目做的是金融数据分析,我主要的工作是把金融数据做一些清洗和规整,然后导入MySQL数据库。Oracle那份,做的是税收业务,我当时主要负责的是GOLDGATE,也就是数据同步过程。
面试官:我不大明白你刚刚说的金融数据分析这一块。你可以具体讲讲你在里边承担的工作吗?
我:当时主要用的是MySQL数据库,采用主从复制原理,实现一主多从的架构。数据清洗这一块,用的是python。
面试官:你经手过的数据的迁移量有多大?
我:几十个T。
面试官:迁移了多久?
我:几个月。
面试官:这么久吗?
我:不是连续迁移的。因为中间还在不断规划中,所以是一点点迁移的。
面试官:你处理过的表有多大?
我:几十个G
面试官:有多少条数据?
我:几个亿。
面试官:那像这样大的表,在进行维护,或者操作的时候应该会比较慢吧。怎么解决这个问题呢?
我:像Oracle的话,会采用分区的办法,将数据表变成一个分区表。这样维护起来,粒度变小。如果有新增数据,直接在新分区插入就可以了。
面试官:像这种大表,在维护索引的时候,会不会很麻烦呢?怎么去建索引比较合理。
我:只建一个主键索引。因为表本身已经很大了,再去建多大索引,会加大系统的存储空间压力。
面试官:你有没有遇到过主从延迟过10几分钟的情况?怎么解决呢?
我:有遇到过。就我最近做的OGG来说吧。实际上,OGG的原理,也就是把原端的二进制日志,以队列文件的形式,推到目标端,目标端再执行与原端一样的操作,这样就保持了两个库的数据一致。那时候出现了延迟的话,有可能是网络上的问题,可以对比一下原端和目标端的队列文件是否一样。如果不一致,可能是网络上的问题,如果这种的话,稍等一下,数据就慢慢写入了。如果队列文件上一致的,说明网络没问题,这时候我们要把思路放在数据库上。看看相关的表是否有触发器之类的,影响了数据的写入。除此之外,还得关注一下目标端的服务器磁盘空间、I/O、内存、CPU等参数。(这部分答的比较凌乱,好在最后差不多圆了回来)
面试官:你刚刚说的,有时候延迟,稍等一下,数据会慢慢写入。确实有时候,应该说大多数时候是这个样子。但是,你有没有遇到过一种情况,就是说,数据延迟了,但是网络没问题,服务器资源也是够的,I/O很高,这种情况下怎么办呢?
我:(想了一会没想出来)
面试官:没关系,这种情况也比较少见。(然后说了。可能要通过调配一下参数,提高I/O)
我:(突然想到)我明白了,你是说,网络没问题,服务器资源也没问题,那么很大可能问题出在了数据库系统上。I/O很高的话,在oracle里边,可能是共享内存不足了,可以通过调大这个参数。但是,其实oracle在设置共享内存的时候,是根据服务器的内存来设置的,一般占用系统内存的1/3-2/3之间。
面试官:嗯,是的。mysql和oracle虽然不一样,但是总是有对应的模块和参数。
面试官:假如现在有一个慢查询,你怎么去进行一下性能分析或者优化呢?
我:(这方面我确实比较薄弱,于是把存储引擎上去引)如果某个表经常涉及大量查询的话,可以将这个表的存储引擎设置成MyISAM,这样可以大大提高查询速度。如果涉及比较多的删、改,就建议用InnoDB。
面试官:嗯,你这是从比较大的方面来分析。有没有具体一点的方法呢?
我:可以先expain一下,通过优化器看一下那个语句的执行计划。。。
面试官:对了,是的。嗯。。。
大概想起来这么多了,还有提到事务性、隔离级别、有些问题忘记了。
问的差不多的时候,面试官开始介绍起项目的情况和主要的工作内容。
总的面试时间,经历了一个多钟。
体验:
昨天晚上睡觉大概翻了一遍MySQL的书,感觉还是挺有用的,至少重新梳理了一下知识体系,也对一些知识点加深了理解。尤其是对索引、视图、存储引擎等知识点的理解。
前两天去市图书馆,上网看了一些主从复制、高可用、备份与恢复的知识点、还有一些比较经典的面试题。
要不是这两天的知识准备,我今天可能很多问题回答不上来,即使有些东西在工作中是做过的,你要是没有基础知识作为支撑,也很难答得好。
其实很多地方也回答的不好,既然是分享,就按实际情况写吧。