当前位置: 首页 > ds >正文

面试题-复合

MySQL

一、基础概念与存储引擎

  1. ACID 特性及实现原理

    • 原子性‌:通过 Undo Log 实现回滚操作,确保事务要么成功要么失败;
    • 持久性‌:依赖 Redo Log 在事务提交前持久化日志,保证数据不丢失;
    • 隔离性‌:通过锁机制和 MVCC(多版本并发控制)实现事务间的隔离。
  2. InnoDB 与 MyISAM 的核心区别

    • 事务支持‌:InnoDB 支持 ACID 事务,MyISAM 不支持;
    • 锁粒度‌:InnoDB 支持行级锁,MyISAM 仅支持表级锁;
    • 外键与 MVCC‌:InnoDB 支持外键约束和 MVCC,MyISAM 不支持;
    • 适用场景‌:InnoDB 适合高并发写操作,MyISAM 适合读密集型场景。

二、索引与查询优化

  1. B+ 树索引的优势

    • 范围查询‌:叶子节点通过链表连接,支持高效范围查询;
    • 稳定性‌:非叶子节点仅存储键值,树高度较低,查询路径稳定;
  2. 覆盖索引与最左前缀原则

    • 覆盖索引‌:查询字段全在索引中时,避免回表操作(如 SELECT a,b FROM table WHERE a=1);
    • 最左前缀原则‌:联合索引 (a,b,c) 需从最左列开始使用,否则索引失效;
  3. EXPLAIN 关键字段解析

    • type‌:const(主键查询) > range(范围索引) > index(全索引扫描)
    • Extra‌:Using index(覆盖索引)、Using temporary(使用临时表)

三、性能优化实践

  1. 慢查询优化方法

    • 日志分析‌:开启 slow_query_log 记录执行时间过长的 SQL38
    • 避免全表扫描‌:优化 WHERE 条件、添加合适索引67
  2. 分页查询优化

    • 深度分页‌:使用覆盖索引 + 延迟关联(如 SELECT * FROM table WHERE id > 1000 LIMIT 10

四、典型陷阱与注意事项

  1. 隐式类型转换

    • 字符串字段未加引号(如 WHERE id = '100' vs WHERE id = 100)会导致索引失效;
  2. 索引失效场景

    • 在索引列上使用函数(如 WHERE YEAR(create_time)=2025);
    • 使用 != 或 <> 运算符

Redis

5 种基本数据类型及场景

  • String‌:计数器、分布式锁、缓存(如 INCR 实现 UV 统计)
  • Hash‌:存储对象属性(如用户信息)
  • List‌:消息队列(LPUSH+BRPOP 实现阻塞队列)
  • Set‌:标签系统、共同好友(交集操作)
  • ZSet‌:排行榜(ZRANGE 查询 TopN)

持久化

缓存问题与解决方案

  1. 缓存穿透

    • 现象‌:大量请求查询不存在的数据(如恶意攻击)
    • 解决‌:
      • 布隆过滤器拦截非法 Key
      • 缓存空值(需设置较短过期时间)
  2. 缓存击穿

    • 现象‌:热点 Key 过期瞬间高并发请求压垮数据库
    • 解决‌:
      • 互斥锁(如 SETNX 实现分布式锁)
      • 逻辑过期(Value 中存储过期时间,异步刷新)
  3. 缓存雪崩

    • 现象‌:大量 Key 同时过期或 Redis 宕机
    • 解决‌:
      • 随机化 Key 过期时间(如基础过期时间 + 随机偏移量)
      • 集群高可用(主从+哨兵)

Golang

一、基础语法与类型系统

  1. make 和 new 的区别

    • make:初始化引用类型(slicemapchannel),返回已初始化的数据结构引用
    • new:分配内存并返回指针,适用于值类型(如结构体),返回未初始化的内存指针
    // make 示例 
    s := make([]int, 0) // 初始化空切片 
    m := make(map[string]int) // 初始化空 map 
    // new 示例 
    p := new(int) // 返回 *int 指针,默认值为 0 
  2. 数组与切片的区别

    • 数组‌:固定长度,长度是类型的一部分(如 [5]int
    • 切片‌:动态长度,底层引用数组片段,包含 ptr(数组指针)、len(长度)、cap(容量)
    slice := []int{1, 2, 3} // 切片可动态扩容 
  3. 字符串与 []byte 转换是否产生内存拷贝

    • 直接转换(如 []byte(str))会触发内存拷贝;通过 unsafe 包可实现零拷贝(但需谨慎使用)

二、并发与协程

  1. 主协程等待子协程完成的方法

    • sync.WaitGroup‌:通过 Add()Done()Wait() 实现协程同步
    var wg sync.WaitGroup 
    for i := 0; i < 3; i++ {wg.Add(1) 
    go func() { defer wg.Done() // 业务逻辑 }() 
    } 
    wg.Wait() // 阻塞直到所有协程完成 
  2. Channel 的特性与使用场景

    • 无缓冲通道:同步通信,发送和接收需配对出现
    • 有缓冲通道:异步通信,缓冲区满时发送阻塞
    • 已关闭通道:接收操作返回零值,发送触发 panic


三、数据结构与内存管理

  1. Map 的初始化与扩容

    • 未初始化‌:值为 nil,直接操作会触发 panic
    • 初始化‌:通过 make(map[string]int, 10) 预分配容量以减少扩容次数
    • 扩容规则‌:当元素数量超过负载因子(默认 6.5)时触发哈希表扩容
  2. Slice 的底层实现与扩容机制

    • 底层结构‌:包含指向数组的指针、长度和容量7
    • 扩容规则‌:
      • 容量 <1024:双倍扩容
      • 容量 ≥1024:按 1.25 倍扩容(考虑内存对齐)

http://www.xdnf.cn/news/6224.html

相关文章:

  • JS,ES,TS三者什么区别
  • 【docker】--容器管理
  • GpuGeek全栈AI开发实战:从零构建企业级大模型生产管线(附完整案例)
  • 2025年Flutter初级工程师技能要求
  • fiftyone-数据库配置和config与app_config配置文件
  • 视频编解码学习十二之Android疑点
  • Git 用户名与邮箱配置全解析:精准配置——基于场景的参数选择
  • 关于并发编程AQS的学习
  • 为什么go语言中返回的指针类型,不需要用*取值(解引用),就可以直接赋值呢?
  • 什么是函数重载?为什么 C 不支持函数重载,而 C++能支持函数重载?
  • 电商平台自动化
  • 基于 Spring Boot 瑞吉外卖系统开发(十五)
  • 【MoveIt 2】使用 MoveIt 任务构造器(MoveIt Task Constructor)进行拾取和放置
  • Docker 常见问题及其解决方案
  • NLP的基本流程概述
  • uni-app vue3版本打包h5后 页面跳转报错(uni[e] is not a function)
  • 使用ECS搭建云上博客wordpress(ALMP)
  • 零基础用 Hexo + Matery 搭建博客|Github Pages 免费部署教程
  • [操作系统] 策略模式进行日志模块设计
  • OkHttp连接池
  • 5月13日日记
  • 《社交应用动态表情:RN与Flutter实战解码》
  • 场景以及八股复习篇
  • 数据清洗ETL
  • 【Python 算法零基础 2.模拟 ④ 基于矩阵】
  • 【starrocks】StarRocks 常见 HTTP 操作与导入错误排查指南
  • 数值积分知识
  • MK米客方德SD NAND:无人机存储的高效解决方案
  • Qwen-3 模型的应用及实际用例
  • 面向具身智能的视觉-语言-动作模型(VLA)综述