MySQL基础常见知识点&面试题总结


目录

  • MySQL基础
    • 面试题
    • MySQL 基础篇
      • Mysql 的基础架构?
      • MySQL 的长连接和短连接
      • 长连接引起的异常重启问题?
      • 说一下 MySQL 执行一条查询语句的内部执行过程?
      • MySQL 查询缓存的功能有何优缺点?
      • MySQL 的常用引擎都有哪些?
      • InnoDB vs MyISAM
      • InnoDB 有哪些特性?
      • 一张自增表中有三条数据,删除了两条数据之后重启数据库,再新增一条数据,此时这条数据的 ID 是几?
      • 自增主键能不能被持久化的问题?
      • 为什么 InnoDB 不把总条数记录下来,查询的时候直接返回呢?
      • InnoDB 和 MyISAM 执行 select count(*) from t,哪个效率更高?为什么?
      • 在 InnoDB 引擎中 count(*)、count(1)、count(主键)、count(字段) 哪个性能最高?
      • MySQL 可以针对表级别设置数据库引擎吗?怎么设置?
      • MySQL 中什么情况会导致自增主键不能连续?
      • 什么是覆盖索引?
      • 如果把一个 InnoDB 表的主键删掉,是不是就没有主键,就没办法进行回表查询了?
      • 内存表和临时表有什么区别?
      • MySQL 中的字符串类型都有哪些?
      • VARCHAR 和 CHAR 的区别是什么?分别适用的场景有哪些?
      • MySQL 存储金额应该使用哪种数据类型?为什么?
      • limit 3,2 的含义是什么?
      • 删除表的数据有几种方式?它们有什么区别?
      • MySQL 中支持几种模糊查询?它们有什么区别?
      • _count(column)_ 和 _count(*)_ 有什么区别?
      • MySQL 中内连接、左连接、右连接有什么区别?
    • MySQL 日志篇
      • MySQL 有哪些重要的日志文件?
      • redo log 和 binlog 有什么区别?
      • 什么是 crash-safe?
      • 什么是脏页和干净页?
      • 什么情况下会引发 MySQL 刷脏页(flush)的操作?
      • MySQL 刷脏页的速度很慢可能是什么原因?
      • 如何控制 MySQL 只刷新当前脏页?
      • MySQL 的 WAL 技术是解决什么问题的?
      • 为什么有时候会感觉 MySQL 偶尔卡一下?
      • redo log 和 binlog 是怎么关联的?
      • MySQL 怎么知道 binlog 是完整的?
      • MySQL 中可不可以只要 binlog,不要 redo log?
      • MySQL 中可不可以只要 redo log,不要 binlog?
      • 为什么 binlog cache 是每个线程自己维护的,而 redo log buffer 是全局共用的?
      • 事务执行期间,还未提交,如果发生 crash,redo log 丢失,会导致主备不一致呢?
      • 在 MySQL 中用什么机制来优化随机读/写磁盘对 IO 的消耗?
      • 以下说法错误的是?
      • 以下说法正确的是?
      • 有没有办法把 MySQL 的数据恢复到过去某个指定的时间节点?怎么恢复?
    • MySQL 性能优化
      • MySQL 性能指标都有哪些?
      • 什么是慢查询?
      • 如何定位慢查询?
      • MySQL 的优化手段都有哪些?
      • 查询优化
      • 优化索引的使用
      • 表结构设计优化
      • 表拆分
      • 读写分离
      • MySQL 常见读写分离方案有哪些?
    • MySQL 开放问题
      • 有一个超级大表,如何优化分页查询?
      • 查询长时间不返回可能是什么原因?应该如何处理?
      • MySQL 主从延迟的原因有哪些?
      • 如何保证数据不被误删?
      • MySQL 服务器 CPU 飙升应该如何处理?
      • MySQL 毫无规律的异常重启,可能产生的原因是什么?该如何解决?
    • 补充
      • 查询语句不同元素(where、jion、limit、group by、having 等等)执行先后顺序?
      • 数据库三范式,根据某个场景设计数据表?
      • MySQL 高并发环境解决方案?
      • Explain 性能分析


MySQL基础

面试题

MySQL 基础篇

Mysql 的基础架构?

  • MySQL 分为 Server 层存储引擎两部分
  • Server 层包括连接器、查询缓存、分析器、优化器、执行器等
    • 连接器:管理连接和权限验证
    • 查询缓存:命中直接返回结果
    • 分析器:词法分析、语法分析
    • 优化器:执行计划生成、索引选择
    • 执行器:操作引擎、返回结果
  • 存储引擎负责存储数据和提供读写 IO 接口,其架构是插件式的,支持 InnoDB、MyISAM、Memory 等多个存储引擎

MySQL 的长连接和短连接

  • 长连接:连接成功后,如果客户端持续有请求,则一直使用同一个连接
  • 短连接:每次执行完很少的几次查询就断开连接,下次查询再重新建立

长连接引起的异常重启问题?

  • 引起异常的原因:MySQL 在执行过程中使用的内存是在连接对象里的,这些资源在连接断开的时候才会释放
  • 解决方法:
    • 定期断开长连接
    • 重新初始化连接资源

说一下 MySQL 执行一条查询语句的内部执行过程?

连接器 → 查询缓存 → 分析器 → 优化器 → 执行器

  • 客户端先通过连接器连接到 MySQL 服务器
  • 连接器权限验证通过之后,先查询是否有查询缓存,如果有缓存则直接返回缓存数据,如果没有缓存则进入分析器
  • 分析器会对查询语句进行语法分析和词法分析,判断 SQL 语法是否正确,如果查询语法错误,会直接返回给客户端错误信息,如果语法正确则进入优化器
  • 优化器对查询语句进行优化处理,例如一个表里面有多个索引,优化器会判别哪个索引性能更好
  • 优化器执行完就进入执行器,开始执行查询语句直到查询出满足条件的所有数据,然后返回

MySQL 查询缓存的功能有何优缺点?

  • 优点是效率高,如果已经有缓存则会直接返回结果
  • 但是,如果数据库表中数据和结构发生变化时(增删改、表结构调整),查询缓存将会失效,导致缓存命中率比较低

MySQL 的常用引擎都有哪些?

  • MySQL 的常用引擎有 InnoDBMyISAM[maiˈzæm]、Memory(所有数据放在内存中) 等
  • InnoDB 是默认的存储引擎

InnoDB vs MyISAM

  • 最大的区别是 InnoDB 支持事务,而 MyISAM 不支持事务
  • InnoDB 支持崩溃后安全恢复,MyISAM 不支持崩溃后安全恢复
  • InnoDB 支持行锁,MyISAM 不支持行锁,只支持表锁
  • InnoDB 支持外键,MyISAM 不支持外键

InnoDB 有哪些特性?

  • 插入缓冲: 对于非聚集索引页,**不是直接,提高性能
  • 两次写:要进行写操作时,不直接写硬盘,而是先拷贝到内存中的两次写缓冲区,然后把两次写缓冲区的内容分两次写到磁盘上
  • 自适应哈希索引:为了提高性能会自动建立一些 hash 索引,查找效率很高,直接通过 hash 值定位到数据

一张自增表中有三条数据,删除了两条数据之后重启数据库,再新增一条数据,此时这条数据的 ID 是几?

  • MyISAM 存储引擎:ID 为 4,因为 MyISAM 表会把自增主键的最大 ID 记录到数据文件里面,重启 MySQL 后不会丢失
  • InnoDB 存储引擎
    • MySQL 8 以前: ID 为 2,因为 InnoDB 表把自增主键的最大 ID 记录到内存中,所以重启数据库后会使最大 ID 丢失
    • MySQL 8.0 :ID 为 4,InnoDB 每次更改时,当前最大计数器值写入重做日志 redo log

自增主键能不能被持久化的问题?

  • MyISAM:自增主键会持久化到数据文件
  • InnoDB:
    • 8 之前:不会持久化
    • 从 8 开始:自增主键会持久化到 redo log

为什么 InnoDB 不把总条数记录下来,查询的时候直接返回呢?

  • 因为 InnoDB 支持事务
  • 即使是在同一时间进行查询,得到的结果也可能不相同

InnoDB 和 MyISAM 执行 select count(*) from t,哪个效率更高?为什么?

  • MyISAM 效率最高
  • 因为 MyISAM 内部维护了一个计数器,直接返回总条数
  • InnoDB逐行统计

在 InnoDB 引擎中 count(*)、count(1)、count(主键)、count(字段) 哪个性能最高?

  • 对于 count(字段) 来说,遍历整张表,取这个字段,然后判断是否为 null,不为 null 则加 1
  • 对于 count(主键 id) 来说,遍历整张表,取主键 id,每次加 1
  • 对于 count(1) 来说,遍历整张表,不取值
  • 对于 count(_) 来说,遍历整张表,不取值,直接按行累加

结果:count(字段)

MySQL 可以针对表级别设置数据库引擎吗?怎么设置?

  • 可以针对不同的表设置不同的引擎
  • create table 语句中使用 engine=引擎名(比如 Memory)来设置此表的存储引擎

MySQL 中什么情况会导致自增主键不能

你可能感兴趣的:(后端开发面试题,#,MySQL面试题,mysql,数据库,面试,java,开发语言)