急急急!高频面试题 数据库必问——MySQL篇(持续更新)

Java面试题MySQL篇

说明:所有题目均来自互联网,如有侵权可联系删除,在此希望大家沉下心来,认真学习。╥﹏╥…因工作原因,日更新10题。整合不易 关注加点赞就是对博主最大的支持!


提示:大家有资源或有更好建议的可以私信博主或评论区留言哦!

文章目录

  • Java面试题MySQL篇
  • 前言
  • 99%必问的十道题
    • 1. 唯一索引比普通索引快吗, 为什么
    • 2. MySQL由哪些部分组成, 分别用来做什么
    • 3. MySQL查询缓存有什么弊端, 应该什么情况下使用, 8.0版本对查询缓存有什么变更
    • 4.MyISAM和InnoDB的区别有哪些
    • 5.MySQL怎么恢复半个月前的数据
    • 6.MySQL事务的隔离级别, 分别有什么特点
    • 7. 做过哪些MySQL索引相关优化
    • 8. 简要说一下数据库范式
    • 9. 一千万条数据的表, 如何分页查询
    • 10. 订单表数据量越来越大导致查询缓慢, 如何处理
  • MySQL基础
    • 1.未完待续
  • MySQL中级
    • 1.MySQL 中有哪几种锁?
    • 2.MySQL 中有哪些不同的表格?
    • 3.简述在MySQL 数据库中 MyISAM 和InnoDB 的区别
    • 4.MySQL 中InnoDB 支持的四种事务隔离级别名称,以及逐级之间的区别?
    • 5.CHAR 和VARCHAR 的区别?
    • 6.主键和候选键有什么区别?
    • 7.myisamchk 是用来做什么的?
    • 8.如果一个表有一列定义为TIMESTAMP,将发生什么?
    • 9.你怎么看到为表格定义的所有索引?
    • 10.LIKE 声明中的%是什么意思?
    • 11.未完待续


前言

送给大家一句话:平凡的脚步也可以走完伟大的行程
急急急!高频面试题 数据库必问——MySQL篇(持续更新)_第1张图片

99%必问的十道题


1. 唯一索引比普通索引快吗, 为什么

唯一索引不一定比普通索引快, 还可能慢。

1. 查询时, 在未使用 limit 1 的情况下, 在匹配到一条数据后, 唯一索引即返回, 普通索引会继续匹配下一条数据, 发现不匹配后返回. 如此看来唯一索引少了一次匹配, 但实际上这个消耗微乎其微.

2. 更新时, 这个情况就比较复杂了. 普通索引将记录放到 change buffer 中语句就执行完毕了. 而对唯一索引而言, 它必须要校验唯一性, 因此, 必须将数据页读入内存确定没有冲突, 然后才能继续操作. 对于写多读少的情况, 普通索引利用 change buffer 有效减少了对磁盘的访问次数, 因此普通索引性能要高于唯一索引。


2. MySQL由哪些部分组成, 分别用来做什么

一. Server

  • 连接器: 管理连接, 权限验证.
  • 分析器: 词法分析, 语法分析.
  • 优化器: 执行计划生成, 索引的选择.
  • 执行器: 操作存储引擎, 返回执行结果.

二. 存储引擎: 存储数据, 提供读写接口。


3. MySQL查询缓存有什么弊端, 应该什么情况下使用, 8.0版本对查询缓存有什么变更

查询缓存可能会失效非常频繁, 对于一个表, 只要有更新, 该表的全部查询缓存都会被清空. 因此对于频繁更新的表来说, 查询缓存不一定能起到正面效果.对于读远多于写的表可以考虑使用查询缓存.8.0版本的查询缓存功能被删了 ( ̄. ̄)。

4.MyISAM和InnoDB的区别有哪些

  • InnoDB支持事务, MyISAM不支持;
  • InnoDB支持行级锁, MyISAM支持表级锁;
  • InnoDB支持多版本并发控制(MVVC), MyISAM不支持;
  • InnoDB支持外键, MyISAM不支持;
  • MyISAM支持全文索引, InnoDB部分版本不支持(但可以使用Sphinx插件);

5.MySQL怎么恢复半个月前的数据

通过整库备份+binlog进行恢复. 前提是要有定期整库备份且保存了binlog日志


6.MySQL事务的隔离级别, 分别有什么特点

  1. 读未提交(RU): 一个事务还没提交时, 它做的变更就能被别的事务看到.
  2. 读提交(RC): 一个事务提交之后, 它做的变更才会被其他事务看到.
  3. 可重复读(RR):一个事务执行过程中看到的数据, 总是跟这个事务在启动时看到的数据是一致的. 当
    然在可重复读隔离级别下, 未提交变更对其他事务也是不可见的.
  4. 串行化(S): 对于同一行记录, 读写都会加锁. 当出现读写锁冲突的时候, 后访问的事务必须等前一个事务执行完成才能继续执行

7. 做过哪些MySQL索引相关优化

尽量使用主键查询:
聚簇索引上存储了全部数据, 相比普通索引查询, 减少了回表的消耗.MySQL5.6之后引入了索引下推优化, 通过适当的使用联合索引, 减少回表判断的消耗.若频繁查询某一列数据, 可以考虑利用覆盖索引避免回表.联合索引将高频字段放在最左边。


8. 简要说一下数据库范式

  • 第一范式: 属性不可再分。
  • 第二范式: 在一范式的基础上, 要求数据库表中的每个实例或行必须可以被惟一地区分. 通常需要为表加上一个列, 以存储各个实例的惟一标识. 这个惟一属性列被称为主关键字或主键。
  • 第三范式: 在二范式的基础上, 要求一个数据库表中不包含已在其它表中已包含的非主关键字信息。

所以第三范式具有如下特征:1). 每一列只有一个值. 2). 每一行都能区分. 3). 每一个表都不包含其他表已经包含的非主关键字信息。


9. 一千万条数据的表, 如何分页查询

数据量过大的情况下, limit offset 分页会由于扫描数据太多而越往后查询越慢. 可以配合当前页最后一条ID进行查询, SELECT * FROM T WHERE id > #{ID} LIMIT #{LIMIT} . 当然, 这种情况下ID必须是有序的, 这也是有序ID的好处之一。


10. 订单表数据量越来越大导致查询缓慢, 如何处理

分库分表. 由于历史订单使用率并不高, 高频的可能只是近期订单, 因此, 将订单表按照时间进行拆分, 根 据数据量的大小考虑按月分表或按年分表. 订单ID最好包含时间(如根据雪花算法生成), 此时既能根据订 单ID直接获取到订单记录, 也能按照时间进行查询。

MySQL基础

1.未完待续

MySQL中级

1.MySQL 中有哪几种锁?

  1. 表级锁 开销小, 加锁快; 不会出现死锁; 锁定粒度大, 发生锁冲突的概率最高, 并发度最低。
  2. 行级锁 开销大, 加锁慢; 会出现死锁; 锁定粒度最小, 发生锁冲突的概率最低, 并发度也最
    高。
  3. 页面锁 开销和加锁时间界于表锁和行锁之间; 会出现死锁; 锁定粒度界于表锁和行锁之间, 并
    发度一般。

2.MySQL 中有哪些不同的表格?

共有 5 种类型的表格: 1、MyISAM2、Heap 3、Merge 4、INNODB 5、MISAM


3.简述在MySQL 数据库中 MyISAM 和InnoDB 的区别

MyISAM
不支持事务, 但是每次查询都是原子的; 支持表级锁, 即每次操作是对整个表加锁; 存储表的总行数;一个 MYISAM 表有三个文件: 索引文件、表结构文件、数据文件;采用菲聚集索引, 索引文件的数据域存储指向数据文件的指针。辅索引与主索引基本一致, 但是辅索引不用保证唯一性。

InnoDb
支持 ACID 的事务, 支持事务的四种隔离级别; 支持行级锁及外键约束: 因此可以支持写并发; 不存储总行数:一个 InnoDb 引擎存储在一个文件空间( 共享表空间, 表大小不受操作系统控制,一个表可能分布在多个文件里), 也有可能为多个( 设置为独立表空, 表大小受操作系统文件大小限制, 一般为 2G), 受操作系统文件大小的限制;主键索引采用聚集索引( 索引的数据域存储数据文件本身), 辅索引的数据域存储主键的值; 因此从辅索引查找数据, 需要先通过辅索引找到主键值, 再访问辅索引; 最好使用自增主键, 防止插入数据时, 为维持 B+树结构, 文件的大调整。


4.MySQL 中InnoDB 支持的四种事务隔离级别名称,以及逐级之间的区别?

SQL 标准定义的四个隔离级别为:

  1. read uncommited : 读到未提交数据
  2. read committed: 脏读, 不可重复读
  3. repeatable read: 可重读
  4. serializable : 串行事物

5.CHAR 和VARCHAR 的区别?

  • CHAR 和 VARCHAR 类型在存储和检索方面有所不同
  • CHAR 列长度固定为创建表时声明的长度, 长度值范围是 1 到 255 当 CHAR 值被存储时, 它们被
    用空格填充到特定长度, 检索 CHAR 值时需删除尾随空格。

6.主键和候选键有什么区别?

表格的每一行都由主键唯一标识,一个表只有一个主键。
主键也是候选键。按照惯例, 候选键可以被指定为主键, 并且可以用于任何外键引用。


7.myisamchk 是用来做什么的?

它用来压缩 MyISAM 表, 这减少了磁盘或内存使用。

MyISAM Static 和 MyISAM Dynamic 有什么区别?
在 MyISAM Static 上的所有字段有固定宽度。动态 MyISAM 表将具有像 TEXT, BLOB 等字段, 以适应不同长度的数据类型。MyISAM Static 在受损情况下更容易恢复。


8.如果一个表有一列定义为TIMESTAMP,将发生什么?

每当行被更改时, 时间戳字段将获取当前时间戳。列设置为 AUTO INCREMENT 时, 如果在表中达到最大值, 会发生什么情况?它会停止递增, 任何进一步的插入都将产生错误, 因为密钥已被使用。怎样才能找出最后一次插入时分配了哪个自动增量?LAST_INSERT_ID 将返回由 Auto_increment 分配的最后一个值, 并且不需要指定表名称。


9.你怎么看到为表格定义的所有索引?

索引是通过以下方式为表格定义的:

SHOW INDEX FROM ;

10.LIKE 声明中的%是什么意思?

% 对应于 0 个或更多字符,只是 LIKE 语句中的一个字符。


11.未完待续


急急急!高频面试题 数据库必问——MySQL篇(持续更新)_第2张图片

你可能感兴趣的:(Java—面试题,mysql,sql,数据库,java,json)