浅谈MySQL数据库面试必要掌握知识点

概述

**本人博客网站 **IT小神 www.itxiaoshen.com

定义

MySQL官方地址 https://www.mysql.com/ MySQL 8系列最新版本为8.0.27,5系列的最新版本5.7.35

MySQL发展至今仍然是世界上最流行的关系型数据库管理系统,使用C和C++语言编写,并且为很多种编程语言提供API.能够处理千万级别的数据,市场占有量还是老大哥地位。

安装

MySQL安装有多种方式,可使用yum安装,也可以从官网下载指定版本解压安装既可,比较简单,安装完完成配置文件,linux下配置文件为my.cnf,windows配置文件为my.ini。

当然还可以使用更为简单docker容器化的安装方式

连接客户端

我们日常连接MySQL客户端工具可以选择使用Navicat For MySQL、SQLyog Community 、MySQL Workbench和phpMyAdmin(web界面操作),具体就按个人习惯喜好去选择,而我们本篇主要是MySQL面试部分,这里就不太展开了,关于MySQL实战应用部分后续我们再单独来剖析。

MySQL版本

MySQL创立于1996年,最初是由瑞典 MySQL AB公司开发所有,在2008年被Sun公司收购,而Sun公司又在2009年被Oracle公司收购,目前MySQL属于Oracle旗下的产品。MySQL官网提供了多种版本,我们来了解一些,但我们常用的还是社区版本。

而官方提供另外一个工具MySQL Workbench(GUI TOOL)是Workbench专为MySQL设计的ER/数据库建模工具,它是著名的数据库设计工具DBDesigner4的继任者,MySQL Workbench又分为两个版本,分别是社区版(MySQL Workbench OSS)和商用版(MySQL Workbench SE)。

MySQL其他分支

上面说到MySQL属于Oracle旗下的产品,由于Oracle已经有了一个商业数据库,他们担心MySQL作为领先的免费开源数据库提供的功能可能太少、发布周期太慢并且可能需要支付更昂贵费用,因此许多基于MySQL其他分支也就应运而生,我们也简单了解一下。

HeatWave

我们都知道MySQL主要是为OLTP场景设计的,OLAP一直是MySQL的短板,内置 MySQL 数据库服务实时查询加速器,在HeatWave出现之前,我们通常不能直接使用MySQL数据库进行OLAP分析,因为其性能不足。于是我们往往是先将MySQL数据同步到HDFS/Hbase/Kudu等存储系统上,再使用MR/Spark/Impala等计算引擎做计算,而HeatWave的到来意味着我们可以“少此一举”。

HeatWave 是一种用于 Oracle MySQL 数据库服务的大规模并行、高性能、内存中查询加速器,可将分析和混合工作负载的 MySQL 性能提高几个数量级。HeatWave 以一半的成本比 Amazon Redshift 快 6.5 倍,以五分之一的成本比 Snowflake 快 7 倍,以一半的成本比 Amazon Aurora 快 1400 倍。带有 HeatWave 的 MySQL 数据库服务是唯一使客户能够直接从他们的 MySQL 数据库运行 OLTP 和 OLAP 工作负载的服务。这消除了复杂、耗时且昂贵的数据移动以及与单独分析数据库的集成的需要。新的 MySQL Autopilot 使用先进的机器学习技术来自动化 HeatWave,使其更易于使用并进一步提高性能和可扩展性。

HeatWave是Oracle云上的架构,实现了分布式计算框架,HeatWave 是为 Oracle MySQL 数据库服务开发的内存查询加速器。它是一个大规模并行、混合、列式、查询处理引擎,具有用于分布式查询处理的最先进算法,可为查询提供非常高的性能。与其他OLAP计算框架的区别是,HeatWave与MySQL结合封装得更好。从运维角度看,首先不再需要做数据同步操作,因为数据存储还是MySQL的InnoDB。在计算的时候把InnoDB的数据读到节点的内存中进行计算,此时InnoDB的更新也会即时同步。HeatWave可以智能地自动配置集群大小,而不需要人为配置,不会浪费资源也不会资源不足。从使用角度来看,使用者应该是无感知的,仍然是通过原有方式(JDBC/ODBC)连接和使用,能感知到的只是OLAP查询速度快了很多。

MySQL面试必备

将原理与实际操作经验相结合,本章不讲sql用法,主要针对的是开发人员需掌握的一些MySQL知识点,涉及索引、事务、优化等方面

说说MySQL存储引擎?

MySQL支持存储引擎很多种,默认已支持上面9种,5.7.35版本也是一样,但我们常用存储引擎主要是InnoDB和MyISAM这两种。

MySQL InnoDB和MyISAM两大引擎对比?

MySQL常用存储引擎的底层原理?

这里小编先推荐一个数据结构可视化的网站,可以帮助我们学习各种数据结构的底层原理,常见的查询算法,顺序查找,二分查找,二叉排序树查找,哈希散列法,分块查找,平衡多路搜索树 B 树(B-tree)

数据结构可视化学习网站 https://www.cs.usfca.edu/~galles/visualization/Algorithms.html

InnoDB和MyISAM这两种引擎底层都是采用B+树的数据结构来构建索引。

B+树是B树的变种,B树是一棵多路平衡查找树,简单来说,B树可以看做平衡二叉树的进阶版,它与平衡二叉树的不同点主要在B树的一个节点可以存放多个关键字,并且B树的每个节点可以有两个以上的子节点,而这些都取决于B树的阶数,当B树的阶数为2时,它就是一个普通的平衡二叉树。单纯从数据结构来讲,B树和平衡二叉树在查找的时间复杂度上并没有什么区别,但数据结构比平衡二叉树复杂一些,计算机读取数据的操作中最耗时的是从磁盘中读取数据,在大多数linux系统中,每次磁盘io会取出4k的连续数据;平衡二叉树因为每个关键字都存放在独立的节点,无法保证在磁盘中的物理存储地址是连续的,因此,在最坏的情况下,每个关键字的读取都需要进行一次磁盘IO。而B树的每个节点可以存放多个关键字,每个节点的关键字在磁盘中的物理存储地址都是连续的,使得每次磁盘IO都可以读取多个关键字,大大减少了磁盘IO次数,使得查找时间更快。我们描述一棵B树是需要定义它的阶数,阶数定义了它最多会有多少个子节点。下面是一棵3阶的B树示例图,一棵m阶的B树简单定义如下:

B+树是B树的变种,在B+树中,所有的关键字都会保存在叶子节点中,叶子节点之间也会有指针进行连接,形成一个链表的形式,和B树相比,这样的结构方便范围查找。比如要查询大于3的关键字,我们从根节点往下遍历,找到关键字为3的叶子节点之后,直接读取3之后的叶子节点就可以了,而不用一次次的从根节点去遍历大于3的关键字。当我们进行的范围查找进行倒序操作的时候,凭借叶子节点的单向链表是无法实现的,因此MySQL中的B+树结构做了一些调整,MySQL将B+树叶子节点的单向链表改为双向链表。而相同节点的B+树则如下,红色的箭头线是MySQL特殊改造实现的。

B+降低树的高度又能支持范围索引,MySQL在使用Innodb引擎的时候页大小默认是16K,一个三层B+树如果以十几个字节作为一个索引节点,叶子节点为800字节,那么也可存储两千万级别数据(1024*1024*20)

基于B+为底层实现,我们也明白MySQL Innodb为何推荐使用自增ID作为主键,不要使用UUID这种作为主键,因为如果是自增主键增加节点就能顺序依次追加到后面即可,避免B+的结构出现分裂带来性能开销,在InnoDB存储引擎中,主键索引是作为聚簇索引存在的,也就是说,主键索引的B+树叶子节点上存储了主键索引以及全部的数据(按照顺序),如果主键索引是自增ID,那么只需要不断向后排列即可,如果是UUID,由于到来的ID与原来的大小不确定,会造成非常多的数据插入,数据移动,然后导致产生很多的内存碎片,进而造成插入性能的下降.总之,在数据量大- -些的情况下,用自增主键性能会好一-些。

Hash索引和B+树所有有什么区别?

索引是一种数据结构,可以帮助我们快速的进行数据的查找。索引的数据结构和具体存储引擎的实现有关,在MySQL中使用较多的索引有B+树、Hash索引。Hash索引和B+树相比如下:

如何选择合适的存储引擎?

什么是聚簇索引和非聚簇索引?

在B+树的索引中,叶子节点可能存储了当前的key值,也可能存储了当前的key值以及整行的数据,这就是聚簇索引和非聚簇索引.在InnoDB中,只有主键索引是聚簇索引,如果没有主键,则挑选一个唯一键建立聚簇索引.如果没有唯一键,则隐式的生成一个键来建立聚簇索引.

当查询使用聚簇索引时,在对应的叶子节点,可以获取到整行数据,因此不用再次进行回表查询.

非聚簇索引一定会回表询吗?
不一定,这涉及到查询语句所要求的字段是否全部命中了索引,如果全部命中了索引,,那么就不必再进行回表查询.

举个简单的例子,假设我们在员工表的年龄上建立了索引,那么当进行select age from employee where age < 20的查询时,在索引的叶子节点上,已经包含了age信息,不会再次进行回表查询.

说说MySQL的联合索引?

MySQL可以使用多个字段同时建立一个索引,叫做联合索引.在联合索引中,如果想要 命中索引,需要按照建立索引时的字段顺序挨个使用,否则无法命中索引.MySQL联合索引底层数据结构也还是B+树,遵循索引最左前缀原则,单列索引其实也可以看做索引列为1的联合索引,联合索引的底层存储跟单列索引时类似的,联合索引是每个树节点中包含多个索引值,在通过索引查找记录时,会先将联合索引中第一个索引列与节点中第一个索引值进行匹配,匹配成功接着匹配第二个索引列和索引值,直到联合索引的所有索引列都匹配完;如果过程中出现某一个索引列与节点相应位置的索引值不匹配的情况,则无需再匹配节点中剩余索引列。

比如:索引包含表中每一行的last_name、first_name和dob列,即key(last_name, first_name, dob),以下情况可以用到索引:

MySQL的binlog有几种格式?

MySQL的binlog有三种格式,分别是statement、row、mixed。

MySQL如何做调优?

MySQL如何应对数据量快速增大?

这里先介绍下Apache Sharding Sphere ,当当网开源贡献,已于2020年4月16日成为 Apache 软件基金会的顶级项目

是一套开源的分布式数据库解决方案组成的生态圈,它由 JDBC、Proxy 和 Sidecar(规划中)这 3 款既能够独立部署,又支持混合部署配合使用的产品组成。 它们均提供标准化的数据水平扩展、分布式事务和分布式治理等功能,可适用于如 Java 同构、异构语言、云原生等各种多样化的应用场景。

Apache ShardingSphere 旨在充分合理地在分布式的场景下利用关系型数据库的计算和存储能力,而并非实现一个全新的关系型数据库。 关系型数据库当今依然占有巨大市场份额,是企业核心系统的基石,未来也难于撼动,我们更加注重在原有基础上提供增量,而非颠覆。

Apache ShardingSphere 5.x 版本开始致力于可插拔架构,项目的功能组件能够灵活的以可插拔的方式进行扩展。 目前,数据分片、读写分离、数据加密、影子库压测等功能,以及 MySQL、PostgreSQL、SQLServer、Oracle 等 SQL 与协议的支持,均通过插件的方式织入项目。 开发者能够像使用积木一样定制属于自己的独特系统。Apache ShardingSphere 目前已提供数十个 SPI 作为系统的扩展点,仍在不断增加中。

如果数据量较大基本优化已不能解决,MySQL主从架构开始包括主主、一主多从等,可以逐步考虑优化如下,这里就不展开偏度,后续有时间我们针对这几个单独

如何设计数据库?

阿里Mysql索引规约

MySQL同时有多个事务可能会产生什么问题?

多事务的并发进行一般会造成以下几个问题

说说MySQL事务隔离级别?

MySQL和其他关系型数据库一样有四种隔离级别,InnoDB默认使用的是可重复读隔离级别,四种隔离级别如下:

说说对于MySQL锁的理解

mysql怎么实现可重复读?

mysql可重复读主要通过undo log版本链+ReadView 机制实现,具体如下

当 MySQL 执行写操作之前,会把即将被修改的数据记录到 undo log 日志里面。只有这样,事务要回滚的时候,即使 Buffer Pool 中的数据被修改了,依然可以从 undo log 日志中,读取到原插入、修改、删除之前的值,最终把值重新变回去,这就是回滚操作。

日志与日志之间通过 roll_pointer 指针连接,就形成了 undo log 版本链。基于 undo log 版本链实现的 ReadView 机制:ReadView 说白了就是一种数据结构,它主要包含这样几部分:

ACID是什么?

事务是一系列的操作,他们要符合ACID特性.最常见的理解就是:事务中的操作要么全部成功,要么全部失败。

简单说说MySQL三大日志?

MySQL如何保证ACID?

MySQL如何尽可能避免死锁

MySQL主从复制有几种复制方式?