数据库工程师面试题及答案.docxVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多

数据库工程师面试题及答案

一、基础理论与选型

问题:关系型数据库(如MySQL)和非关系型数据库(如MongoDB)核心区别是什么?各举3个实际项目中常用的场景,说明为什么选这种类型数据库?

答案:核心区别在数据结构和事务支持——关系型是结构化表+强事务(ACID),非关系型是灵活结构(文档/键值等)+弱事务(部分支持最终一致性)。

场景举例:

选MySQL:用户订单系统(需事务保证下单-扣库存-支付一致性)、财务账单(强事务+结构化数据)、电商商品SKU管理(多表关联查询频繁);

选MongoDB:用户行为日志(非结构化+高写入)、APP首页个性化推荐(嵌套结构存储用户偏好)、物联网设备实时数据(字段多变,无需固定表结构)。

问题:MySQL中InnoDB和MyISAM引擎的差异?现在项目里为什么很少用MyISAM了?

答案:差异主要在事务、锁和崩溃恢复:InnoDB支持事务(ACID)、行级锁、崩溃后数据恢复,MyISAM不支持事务、只有表级锁、崩溃易丢数据。

少用MyISAM的原因:现在项目大多需要事务(比如下单、支付),表级锁在高并发写场景(如秒杀库存扣减)会严重阻塞,而且MyISAM不支持外键(虽然外键慎用,但部分场景需要),崩溃恢复能力差,生产环境风险高。

二、SQL实战与优化

问题:有一张用户表(user_id主键,register_timedatetime,cityvarchar),写SQL统计“近30天每个城市的新增用户数,若某天无新增则显示0”,并说明怎么优化这条查询的性能?

答案:

SQL语句:

--先构造近30天的日期表(避免某天无数据不显示)

WITHdate_rangeAS(

SELECTCURDATE()-INTERVALnDAYASstat_date

FROM(SELECT0nUNIONALLSELECT1UNIONALL...SELECT29)t--生成30天日期

)

SELECT

dr.stat_date,

u.city,

COUNT(u.user_id)ASnew_user_count

FROMdate_rangedr

LEFTJOINuseru

ONDATE(u.register_time)=dr.stat_date

ANDu.register_time=DATE_SUB(CURDATE(),INTERVAL30DAY)--过滤近30天数据

GROUPBYdr.stat_date,u.city

ORDERBYdr.stat_dateDESC,new_user_countDESC;

性能优化:

给register_time加索引(避免全表扫描),如果查询频繁,可建联合索引(register_time,city),覆盖查询字段,减少回表;

避免用DATE(register_time)函数(会导致索引失效),改成u.register_timeBETWEENdr.stat_dateANDdr.stat_date+INTERVAL1DAY-INTERVAL1SECOND;

日期表生成用表变量或预生成的日期字典表,避免每次子查询生成(尤其MySQL5.7及以下,子查询效率低)。

问题:执行SELECT*FROMordersWHEREorder_status=1ANDpay_timeBETWEEN2024-05-01AND2024-05-31时查询很慢,怎么排查原因?至少说3个排查方向和对应解决办法。

答案:

先看执行计划:用EXPLAIN分析,看是否走索引——如果type是ALL(全表扫描),说明没用到索引。解决:给order_status+pay_time建联合索引(注意顺序:等值查询字段order_status放前面,范围查询pay_time放后面,避免范围后字段失效);

查索引是否失效:比如pay_time是varchar类型(存了日期字符串),但查询用了datetime格式,会导致隐式转换失效索引。解决:统一字段类型,或查询时按varchar格式传值(如pay_timeBETWEEN2024-05-0100:00:00AND2024-05-3123:59:59,确保类型匹配);

看表数据量和碎片:如果orders表是千万级,且长期删除/更新,可能有索引碎片。解决:用OPTIMIZETABLEorders整

您可能关注的文档

文档评论(0)

151****9429 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档