无意中看到阿里巴巴的面试题,,借此回首DBMS时刻趁热打铁巩固一下基础
拿到题目大概浏览了一遍难度大概在中上游水平,自己跪了接近35%的题目
自己答题如下,欢迎大家讨论分析题
1、MySQL的复制原理以及流程 . (1)、先问基本原理流程,3个线程以及之间的关联; . 从 发起请求I/O thread线程请求 主 主 接收到请求使用binlog dump线程回应 从 从 I/O thread线程将请求接收下来保存为中继日志 从 再开SQL thread线程将中继线程保存为执行日志 . (2)、再问一致性延时性,数据恢复;( 每个人角度不同 ) . 出发点 是否使用工具 业务线是否正常 备份恢复成本 一致性 热备份 借助 细微影响 偏高 组合才能完全 温备份 借助 受一部分 中等 完全 冷备份 无 停滞 较低 完全 . mysqldump innodb热备 结合binlog 启动大事务 innodb温备 最好锁定表(若有事务则需要结合binlog) . 数据恢复: 通常情况下 每周完整 + 周中的增量or差异 + 新的binlog . (3)、再问各种工作遇到的复制bug的解决方法。 手抖将同步时间改太短,导致cpu空转 主主模式主键重复,调整auto_instcrment . . 2、MySQL中myisam与innodb的区别,至少5点 . (1)、问5点不同; . 事务有无 多版本控制 行锁 热备份 崩溃恢复 . (2)、问各种不同mysql版本的2者的改进; . 同(1)问缺什么补什么 innodb -> xtradb 性能上的 myisam -> aria 崩溃恢复 . (3)、2者的索引的实现方式。 . btree InnoDB,MyISAM 左节点小于右节点,提高查询效率 rtree MyISAM btree是2维结构,,那么rtree多于3维 . . 3、问MySQL中varchar与char的区别以及varchar(50)中的30代表的涵义 . (1)、varchar与char的区别; . 同宽度填不填充0的问题,varchar变长 . (2)、varchar(50)中50的涵义; . 长度50字符 . (3)、int(20)中20的涵义;( 跪了,看了几年了一直没去理解过 - -! ) . 显示宽度 int 4字节 建好字段后为 int(11) 最大表示 -21亿 - +21亿 这是11位哦 int(20) 无意义,这是这么一问 . (4)、为什么MySQL这样设计。(没看明白) . [备注] 本人也面试了近12个2年MySQL DBA经验的朋友,没有一个能回答出第(2)、(3)题 . . . 4、问了innodb的事务与日志的实现方式 . (1)、有多少种日志; . 错误,查询,超时查询,二进制,中继,事务 . (2)、日志的存放形式; . table,file . (3)、事务是如何通过日志来实现的,说得越深入越好。(总觉得不够!!) . . 流程: 事务发起 -> 内存buffer(提高性能不能一直写磁盘啊) -> 事务日志 -> 磁盘数据 . 事务日志到磁盘的过程可能会出意外,,再次恢复服务后,,事务日志中事务会自动状态同步到磁盘 . 5、问了MySQL binlog的几种日志录入格式以及区别 . (1)、各种日志格式的涵义; . statement语句格式 只是语句状态信息 省空间 适应性强 无法精确复制(触发器,函数) row行格式 能够实现几乎所有的复制场景 较少的cpu占用率 无法准确得知操作 浪费空间 mixed混合格式 怎么方便怎么来 常用 . (2)、适用场景;(自己领悟...) . 屌丝服务器 土豪服务器 文艺服务器 . (3)、结合第一个问题,每一种日志格式在复制中的优劣。 . 语句: 可能会造成数据不一致 行: 日志文件偏大,不易存储转移,恢复也可能比较慢 混合: 理论上结合两者特点 . 6、问了下MySQL数据库cpu飙升到500%的话他怎么处理? . (1)、没有经验的,可以不问;(如果问到我肯定要选这个啊...) . (2)、有经验的,问他们的处理思路。 . 列出所有进程 show processlist 观察所有进程 多秒没有状态变化的(干掉) 查看超时日志或者错误日志 (做了几年开发,一般会是查询以及大批量的插入会导致cpu与i/o上涨,,,,当然不排除网络状态突然断了,,导致一个请求服务器只接受到一半,,比如where子句或分页子句没有发送,,当然的一次被坑经历) . . 7、sql优化 . (1)、explain出来的各种item的意义;(一谈优化脑海就是sql语句袭来,,索引重建!!!) . 分析当前的select语句,, select_type 当前查询的类型(简单or连接or组合or子查询) rows 做笛卡尔积要组合的行 extra 额外信息 (其余的实在没记住) . 考虑将面试官带上其他话题 优化sql中 : ) where 不必要的括号,常量重叠,去除常量条件 范围优化 少用like啊 根据当前的索引选定不同的范围条件啊 多关键字优化 is null, distinct, left/right join, join, union,order by,group by,limit 小表不需要索引: select * from table force index(index_name) where 索引合并优化 select * from table ignore index(indexname1,indexname2) 一张表有多索引,忽略几个在查,可能提高性能 . (2)、profile的意义以及使用场景;(没看台明白) . (3)、explain中的索引问题。(一问中回答过,,只能说之前的做法是 存储过程+算法) 编译过的sql语句还是相当能提升性能的 还有就是组织一些特有的数据构成 (升序 or 树结构 or ...) 这样在过程中加入一些算法(二分,排序树)进行优化,效果还是比较明显 . ps: oracle中专门有rank,percent_rank这些函数处理数据 得以于初出茅庐之时为当时国字号企业做的一个'大'数据项目 14W/min 对当时的我来说,天文数字,学到不少东西 . 8、备份计划,mysqldump以及xtranbackup的实现原理 . mysqldump 做之前要日志滚动,记录同步位置,请求锁 xtranbackup 没有锁表,将二进制,事务日志都备份下来,之后必要要做准备,才能用于还原 . (1)、备份计划; . 前面说过了..当然因业务,实际需求,场景做动态规划 . (2)、备份恢复时间;(没看太明白) . 但是最好在恢复的时候不要进行写操作 . (3)、备份恢复失败如何处理。 . 检查日志排除问题,如果不行删除当前所有数据文件(不包括二进制哦),利用之前完整备份 + 增量 + 二进制再次重试 . 9、500台db,在最快时间之内重启 . shell脚本, ansible工具 . 10、在当前的工作中,你碰到到的最大的MySQL DB问题是?(对于这个实在没经验) . . 11、innodb的读写参数优化(跪了,,顺手去查询分析的) . (1)、读取参数,global buffer pool以及 local buffer; . 全局缓存池(类似oracle的RAC) 局部缓存器(针对session进行缓存) . (2)、写入参数(不明白); . (3)、与IO相关的参数; . innodb_read_io_threads 读io的线程数 innodb_io_capacity io总量???? innodb_write_io_threads 写io的线程数 innodb_use_native_aio 实现aio就是纯异步 . (4)、缓存参数以及缓存的适用场景。 . cache大小,cache区块大小,单目标最大,cache区块总大小(单词忘记了 查 query_cache) . 12、请简洁地描述下MySQL中InnoDB支持的四种事务隔离级别名称,以及逐级之间的区别? . read uncommitted 可读到未提交数据 read committed 读到提交过后的数据 REPEATABLE-READ 可重读数据 serialization 串行化读完数据 . (后面送的 :) 更高级的隔离级别 snapshot committer 快照级别一致性提交隔离 snapshot 快照读取 . 13、表中有大字段X(例如:text类型),且字段X不会经常更新,以读为为主,请问 . (1)、您是选择拆成子表,还是继续放一起; . 拆带来的问题 不拆可能带来的问题 连接消耗 + 存储拆分空间 VS 查询性能 . 如果能容忍拆分带来的空间问题,,,拆的话最好和经常要查询的表的主键在物理结构上放置在一起(分区) 顺序IO,减少连接消耗,,,最后这是一个文本列 再加上一个全文索引来尽量抵消连接消耗 . 如果能容忍不拆分带来的查询性能损失的话: 上面的方案在某个极致条件下肯定会出现问题,那么不拆就是最好的选择 . (2)、写出您这样选择的理由。 . 已填 (观察过国内外论坛项目的数据库设计,,好像没看见谁拆过,,,感觉想多了,,要不就是我记错了,,,还需要再考证) . 14、MySQL中InnoDB引擎的行锁是通过加在什么上完成(或称实现)的?为什么是这样子的?(跪了,google一下) . (这是我自己不知道答案前YY的,不要当真)程序做这样的处理一般都会用单例模式多次锁定(保 持当前对象的状态值),数据库也类型处理吧!!将当前行状态标记为锁定中..还有那一个线程锁的.. . google了一下,, InnoDB是基于索引来完成行锁 例: select * from tab_with_index where id = 1 for update; for update 可以根据条件来完成行锁锁定,并且 id 是有索引键的列, 如果 id 不是索引键那么InnoDB将完成表锁,,并发将无从谈起 . . .