25届实习秋招-Java面试-MySQL数据库面试题整理-牛客网近一年

发布时间 2023-11-18 18:55:36作者: Blunt-Razor

MySQL

概述:

  • 关系型数据和非关系型数据库的区别,有哪些应用场景
    • 有哪些非关系的

单表操作:

  • 三种SQL语言类型,MySql本身常用命令

  • DDL-数据定义语句:

  • DML

  • DQL

    • select条件查询

    • 排序查询:

      • 升序和降序,按a字段升序b字段降序怎么排
    • 分组查询(函数查询):

    • SELECT 列名 FROM 表名 [WHERE 条件] GROUP BY 分组列名 [HAVING 分组后条件过滤] [ORDER BY 排序列名 排序方式]; 执行顺序。

    • where 和 having

      • 优先where过滤
    • 去重

多表操作:

  • 约束
    • 连接查询:
    • 内连接:
      • 显式内连接:

      • 隐式内连接:内连接中 WHERE 子句和 ON 子句是等价的

      • 等值,非等值

    • 外连接:
      • 左连接,右连接,可以互换
      • 如果改变表 join 顺序,10个表一起 join
  • 嵌套查询/子查询。
    • 可以嵌套在哪
    • 讲讲mysql的子查询可以被什么代替,左连接。
    • union的作用,union all
  • 分页查询:

视图与存储过程

  • 了解

体系架构

存储引擎:

索引机制:

  • 索引介绍

    • 索引解决了什么问题,为什么要索引

      • 查询数据库的表两种方式
    • 索引的优缺点

      • 什么时候加索引
      • 底层实现
  • 索引的操作

    • 怎么看是否用了索引
    • 创建索引的命令
  • 索引的结构

    • 数据页:节点和数据页

    • B+树

      • B+树的原理
        • 二叉平衡树和红黑树(自平衡排序二叉树)的查询时间复杂度
          • 索引为什么用b+树,为啥不用二叉树
        • B树和B+树的区别是什么?为什么不用b树。
        • 为什么使用B+树而不是使用HashMap,hash的优缺点
          • 还有哪些使用其他数据结构的数据库,为什么redis使用的是哈希索引
        • B+树叶子节点结构特点-优化结构
          • 优化:B+树的非叶子节点为什么是双向链表。
      • B+树影响磁盘IO次数的因数有哪些?B+树的查询只访问一次磁盘吗
        • MySQL InnoDB B+树底层原理了
        • 一个8字节big int数据+6字节主键,算三层树能存储多少条数据
          • 什么因素会影响层数,B+树每一层越宽越好吗
        • 一般b+树高度,每层存多少数据
        • varchar类型和bigint类型选择哪个建立索引-可以从查询角度回答
      • 索引维护:插入一条数据B+树的分裂情况
      • b+树新增、删除节点是怎么操作的?
  • 索引的分类

    • 按照功能:唯一(NULL),主键索引,组合索引。
      • 手机号适不适合当主键
        • 主键为什么是整型并且是自增的,从效率上
    • 结构:B-Tree索引、哈希索引、R-Tree索引、全文索引等等
    • 聚簇索引和二级索引:
      • 聚簇索引和非聚簇索引的底层实现,以及区别
        • 如何创建呢:聚簇和非聚簇怎么创建
      • 聚簇索引的缺点:
        • 聚簇索引具体存储结构是什么,插入过程,查询过程
      • MyISAM的索引保存:索引和数据分开存储
  • 索引的设计原则

    • 什么时候需要建立索引,什么样的数据不推荐加索引
    • 要使用/设计一个索引要考量哪些原则。从三个方面
  • 索引的优化

系统优化

  • 优化步骤--索引性能分析

    • 怎么对MySQL进行调优,工具有哪些。
    • 怎么看语句执行频率
    • 定位低效语句:
      • 如何定位低效SQL语句-日志
    • Profile分析:常用命令,看各阶段/cpu
    • Explain语句--从执行计划角度
      • 各个字段含义,重点关注哪个字段。explain调优。
        • index和ref的区别
      • Extra中 的参数意思。
    • 怎么处理慢查询?假设确实走了索引但是还是很慢,你会怎么排查?
  • 索引优化

    • 避免失效--失效的几种情况

      • 语句错误--索引失效及场景

        • 最左前缀

          • 部分失效
          • 最左匹配与入参顺序有关吗(有and和没有and)
          • 为什么要遵守前缀匹配
        • 范围查询:

        • 函数操作

        • 字符串:单引号:

          • 有一个字段varchar a,where a = 1会不会走索引?变成where a='1'呢?
          • select x from y where id = 1111 order by create_time limit 1999,100。可能使用到什么索引,这个sql有什么问题?执行效率上有什么问题? create_time,id
        • 模糊查询:

          • %x定位不到区
          • 左右模糊查询区别
        • 给一张表,字段为ABCD,如果查询ABC,AC,CD,怎么设置索引
          (a,b,c)联合索引但是where c=1会不会有用
          组合索引 A B C, where A = x and C = x 会触发索引吗 where C = x and B = x and A = x
          有一个A,B,C的联合索引 select * from xx where A=1 and B=1 orderby C limit 1000能用到几个字段?  AB用到了,使用explain尝试了,C是可以用到的
          联合索引(a, b, c) , a = 3 and b > 4 会走索引吗?
          a = 3 and b > 4 order by b 呢,会走索引吗
          
    • 系统优化:

    • 底层原理:

      • 索引为什么失效,从索引的结构的层面
  • 表的优化

    • 分区表(非重点)
    • 临时表
      • 跨库查询(略看)
  • Sql优化

    • 数据插入

    • 自增主键,连续

    • 分组和排序

    • 分页查询优化:

      • 很大的数据量如何优化:
    • 统计计数

      • count的实现,count不同字段
    • update优化

      • 行锁和表锁
    • 使用提示:

      • 索引用的不对怎么强制使用索引?
    • 数据库优化/调优有哪些,说一下sql调优经历,我说索引和表关联

      • 加redis

事务

  • 什么是事务:

  • 事务管理

    • 基本的操作,默认开启事务
  • 隔离级别:

    • 数据库事务会相互影响吗,mysql默认隔离级别
      • 解决读写问题
      • 不同隔离级别解决了什么问题/ 还有什么问题
        • 幻读,幻读和不可重复读的区别
      • RC和RR如何保证-见MVCC

  • ACID 特性及实现(InnoDB)

  • 持久性--用哪个log,存放位置,存储格式

    • WAL原则好处
    • 日志刷盘时机
    • redolog怎么从故障中恢复
    • 日志对比:
      • 恢复数据库你觉得是用redo log还是bin log?
    • 日志两阶段提交
      • 为了解决什么,见javaguide
  • 原子性:

    • 存放位置和作用
    • undo log什么时候删除
  • 隔离性:

    • 一般使用MVCC/锁解决,读写/写写冲突(乐观悲观)

    • 快照读和当前读

      • 什么语句对应快照读(无锁),什么语句对应当前读(共享/排他)
        • 快照读又包含RC/RR/serializable
      • 快照读是出现读写冲突时(非阻塞读),而当前读已经加读写锁了
    • 快照读的RC/RR实现方式MVCC(多版本并发控制):用来解决读写冲突

      • MVCC怎么实现的

        • undo log 版本链,数据库隐藏字段,Read view

        • Read view--返回版本链哪个

          • 读视图产生时机,RC和RR的区别
          • 存储了哪几个字段
          • 可见算法分析
      • MVCC解决了什么问题--脏/幻/不可重复读

        • 产生不可重复读和幻读的根源
        • MVCC能解决幻读吗:快照读(RC/RR/serializable)可/当前读不可
          • 当前读要通过锁解决
        • RR用MVCC怎么实现的?RR怎么解决不可重复读
        • RR存在什么问题如何解决(幻读)
          • 快照读就是普通select 用的是MVCC(不完全解决)
          • 当前读就是select + lock 锁机制 读的是最新数据(会幻读)
          • 条件列未使用到索引,RR锁表,RC锁行
        • 注意RC和RR也可以基于锁实现,用MVCC只是为了不阻塞。
  • 一致性含义

    • 怎么实现的
  • 加锁分析:

    • 不同级别怎么加锁
      • RC和RR
    • 插入新数据的锁

  • 锁的基本介绍:

    • 锁的分类:按粒度分类,各自的优缺点,适用范围(什么时候加)
    • 引擎支持的锁的类型
  • 表级锁的分类,锁冲突概率

    • 怎么加/解锁
    • 表锁:分类
    • 元数据锁作用
    • 意向锁
      • 和元数据锁的区别
      • 语法,与其他锁的兼容性
  • 行锁锁分类:针对索引加锁

    • 可分为记录锁(Record lock),间隙锁,next key lock(临键锁)

      • 记录锁:
        • mysql加行锁有什么问题,如何解决
        • 什么时候加记录锁
      • 间隙锁的作用,优缺点
        • 普通索引和唯一索引上加行级锁有什么区别
      • Next Key Lock底层如何
    • 锁的兼容性

      • 不同的DML语句是什么锁,读锁写锁的具体代码
    • 如何解决的幻读

      • 两种方案
      • 如果在>80的范围内插入一条90的数据会不会出现幻读,怎么解决的
    • mysql死锁情况,解决方案,怎么发现

  • 锁的相关问题:

    • update100行用for循环单线程更快还是多线程更快(没加索引的情况下)
    • delete from test where a = '1' ,a 既不是主键也不是普通索引,判断加什么锁? 表锁。
    • mysql大表增加一列字段可能会出现什么问题怎么解决

范式

  • 数据库范式意义,生产环境一般用哪种

  • 不满足第三范式会有什么影响弊端

MySQL主从

日志

  • binlog和redolog的区别,属于哪个

  • 三个日志 redolog和binlog是否是必须的 为什么

  • update涉及什么日志,过程是什么

  • mysql怎么持久化,binlog和redolog日志的写入机制是什么

优化-分库分表

  • MySQL分库分表详解

  • 目的是什么

  • 分库分表的区别,优点

    • 垂直分库/分表
  • 水平分库分表

    • 分表用什么字段好,分表策略
  • 分库分表后如何查询数据。使用ShardingJDBC即可ShardingJDBC既提供了读写分离的功能也提供了分库分表查询的功能

  • 说一下关系数据库常见的一对多、多对多的场景

  • 有没有测试过跨表查询