今天给大家总结了非常全面的MySQL面试题及答案,重点会包含:MySQL索引、MySQL事务、MySQL进阶等MySQL面试题。
MySQL基础
1.MySQL 有哪些数据类型?
MySQL 数据类型非常丰富,常用类型简单介绍如下:
整数类型:BIT、BOOL、TINY INT、SMALL INT、MEDIUM INT、 INT、 BIG INT
浮点数类型:FLOAT、DOUBLE、DECIMAL
字符串类型:CHAR、VARCHAR、TINY TEXT、TEXT、MEDIUM TEXT、LONGTEXT、TINY BLOB、BLOB、MEDIUM BLOB、LONG BLOB
日期类型:Date、DateTime、TimeStamp、Time、Year
其他数据类型:BINARY、VARBINARY、ENUM、SET
…
2.CHAR和VARCHAR的区别?
1.CHAR和VARCHAR类型在存储和检索方面有所不同;
2.CHAR列长度固定为创建表时声明的长度,长度值范围是1到255;
当CHAR值被存储时,它们被用空格填充到特定长度,检索CHAR值时需删除尾随空格。
3.MySQL有哪些常见存储引擎?
MySQL 常见的存储引擎,可以使用
SHOW ENGINES
命令,来列出所有的存储引擎

可以看到,InnoDB 是 MySQL 默认支持的存储引擎,支持事务、行级锁定和外键。
4.BLOB和TEXT有什么区别?
BLOB是一个二进制对象,可以容纳可变数量的数据。TEXT是一个不区分大小写的BLOB。
BLOB和TEXT类型之间的唯一区别在于对BLOB值进行排序和比较时区分大小写,对TEXT值不区分大小写。
5.SQL语言包括哪几部分?每部分都有哪些操作关键字?
SQL语言包括数据定义(DDL)、数据操纵(DML),数据控制(DCL)和数据查询(DQL)四个部分。
数据定义:Create Table,Alter Table,Drop Table, Craete/Drop Index等;
数据操纵:Select ,insert,update,delete;
数据控制:grant,revoke;
数据查询:select;
6.MySQL字符串类型可以是什么?
字符串类型是:
- SET;
- BLOB;
- ENUM;
- CHAR;
- TEXT;
7.关系型和非关系型数据库的区别?
关系型数据库的优点:
- 容易理解,因为它采用了关系模型来组织数据;
- 可以保持数据的一致性;
- 支持复杂查询;
非关系型数据库(NOSQL)的优点:
- 无需经过 SQL 层的解析,读写效率高;
- 基于键值对,读写性能很高,易于扩展;
- 可以支持多种类型数据的存储,如图片,文档等等;
- 高扩展,可分为内存性数据库以及文档型数据库,比如 Redis,MongoDB,HBase 等;
数据库设计
1.数据库设计三大范式
在数据库表设计上有个很重要的设计准则,在关系数据库中这种规则 就是范式,范式来自英文Normal Form,简称NF。
在实际开发中最为常见的设计范式有三个:三大范式。
1.第一范式:确保每列保持原子性,所有字段值都是不可分解的原子值;
2.第二范式:确保表中的每列都和主键相关,一个表中只能保存一种数据,不可以把多种数据保存在同一张数据库表中;
3.第三范式:确保每列都和主键列直接相关,而不是间接相关;
满足最 低要求的范式是第一范式(1NF),在第一范式的基础上进一步满足更多规范要求的称为 第二范式(2NF),其余范式以此类推。
一般来说,数据库只需满足第三范式(3NF)就行 了。
2.数据库设计的第一范式
定义: 属于第一范式关系的所有属性都不可再分,即数据项不可分。
理解: 第一范式强调数据表的原子性,是其他范式的基础。
举一个例子,如下图所示:
上图的地址列就不是原子性的,还可以细分,细分后,如下图所示(绿色部分):
地址列,被拆解为国家和城市两个列,这样的改造就符合了第一范式。
一句话总结:第一范式强调的是列的原子性,即列不能够再分成其他几列,比如:上图的国家Country,城市 City,已经不可再分割,则满足第一范式1NF。
3.数据库设计的第二范式
第二范式(2NF)是在第一范式(1NF)的基础上建立起来的,即满足第二范式(2NF)必 须先满足第一范式(1NF)。
第二范式(2NF)要求数据库表中的每个实例或行必须可以被惟一地区分。,也就是说要求表中只具有一个业务主键,而且第二范式(2NF)要求实体的属性完全依赖于主关键字。
还是举例说明,这样更加容易理解第二范式,如下图所示:
上图的订单表就不满足第二范式,因为第二范式要求每个表必须有主关键字Primary key,而且每个非主属性完全依赖于主键,上图红色标识出现了2个主关键字。
所以上图订单表,还可以拆分为两张独立的表:订单表和商品表,拆分后如下图所示:
订单表:
商品表:
简要总结:第二范式就是每张表只描述一件事情,先满足第一范式,另外包含两部分内容,一是表必须有一个主键,二是每个表都强依赖于其主关键字,而不能只依赖于主键的一部分。
4.数据库设计的第三范式
再满足第二范式的基础上,保证每一列数据都要跟主键直接关联,不能出现传递依赖。
第三范式具有如下特征:
- 每一列只有一个值每一行都能区分;
- 每一个表都不包含其他表已经包含的非主关键字信息。
如下图所示:
上图的订单表中的顾客名称,就不符合第三范式,因为它存在了对非主键顾客编号的依赖,每一个表都不包含其他表已经包含的非主关键字信息。
改进后,去掉顾客名称,就符合第三范式了,如下图所示:
简要总结:第三范式满足第二范式,并且表中的列不存在对非主键列的传递依赖。
MySQL索引
1.MySQL索引作用
索引在数据库中的作用类似于目录在书籍中的作用,用来提高查找信息的速度。
如下图所示:
通过创建索引,可以在查询的过程中,提高系统的性能。
2.可以使用多少列创建索引?
任何标准表最多可以创建16个索引列。
3.MySQL索引类型主要包含哪些?
MySQL索引类型主要分为:主键索引、唯一索引、普通索引和、全文索引。
4.简单描述mysql中索引,主键,唯一索引,联合索引的区别?
索引是一种特殊的文件,InnoDB数据表上的索引是表空间的一个组成部分,它们包含着对数据表里所有记录的引用指针。
主键是一种特殊的唯一索引,在一张表中只能定义一个主键索引,使用关键字 PRIMARY KEY 来创建。
mysql中唯一索引的关键字是unique index,唯一索引可以有多个,但索引列的值必须唯一,索引列的值允许有空值。
普通索引(index)顾名思义:就是各类索引中最为普通的索引,相对于普通索引,唯一性索引的值是唯一的,可以更快速的通过该索引来确定某条记录。
索引可以覆盖多个数据列,如像INDEX(columnA, columnB)索引,这就是联合索引。
索引可以极大的提高数据的查询速度,但是会降低插入、删除、更新表的速度,因为在执行这些写操作时,还要操作索引文件。
5.什么情况下设置了索引但无法使用
1.以“%”开头的LIKE语句,模糊匹配;
2. OR语句前后没有同时使用索引;
3. 数据类型出现隐式转化,比如:varchar不加单引号的话可能会自动转换为int型等
6.MySQL索引原理
索引是一种高效获取数据的存储结构,所以要理解MySQL索引的原理,必须清楚一种数据结构就是B树或者 B 树。
1.B 树
MySQL一般以B 树作为其索引结构,具体有什么特点呢?
- 所有值按顺序存储,每个叶子到根的距离相同;
- 非叶子节点不存储数据,只存储指针索引;
- 叶子节点存储所有数据,不存储指针;
- 每个叶子节点都有指向相邻下一个叶子节点的指针,即顺序访问指针;
好了说了这么多的 B 树的特点,我们来张图看看 B 树到底长什么样子。
MySQL事务
1.MySQL事务的隔离级别?
主要包含如下四种:
数据库事务的隔离级别主要是四种:读未提交、读已提交、可重复读、串行化。
2.MySQL事务的四大特征?
数据库事务具有四大特性:原子性、一致性、隔离性、持久性,简称4大ACID特性。
1.原子性(Atomicity)
所有操作,要么全部完成,要么全部不完成,不会结束在中间某个环节。
2.一致性(Correspondence)
数据必须保证从一种一致性的状态转换为另一种一致性状态。
3.隔离性(Isolation)
指当多个用户并发操作数据库时,数据库为每一个用户开启不同的事务,这些事务之间相互不干扰,相互隔离。
4.持久性(Durability)
事务一旦commit,则数据就会保存下来,即使提交完之后系统崩溃,数据也不会丢失。
一般来说,事务是必须满足4个条件(ACID)。
3.MySQL事务原理
MySQL架构,如下图所示:
每次update、insert、delete类型的SQL执行时都会先写三条日志。
- bin log记录执行的每条SQL,用来做主从复制;
- redo log记录修改内容和修改页的位置,用来维护持久性;
- undo log记录相反类型的SQL,用来做rollback和实现mvcc。
MySQL innoDB引擎中数据的一致性和原子性一样,也是用事务日志undo log实现的。
- 事务的原子性是通过undo log(回滚日志)实现的;
- 事务的持久性是通过redo log 来实现的;
- 事务的隔离性是通过(读写锁 MVCC)来实现的;
事务的一致性是通过原子性,持久性,隔离性来实现的。
MySQL语句
1.连接本机数据库
mysql -uroot -p密码
2.连接到远程主机上的MYSQL
mysql -h 127.0.0.1 -uroot -p 123456
注:u与root可以不用加空格,其它也一样
3.修改mysql中root的密码
mysqladmin -u root password "newpwd";
4.添加创建用户
添加用户:
create user mikechen;
给用户权限:
grant all on *.* to 'mikechen'@'localhost' identified by 'password' ;
这里是把操作数据库的所有权限给了mikechen,并且设置密码是password。
5.SQL查询五子句
语法:
基本语法: mysql> select */字段列表 from 数据表名称 where 子句 group by 子句 having 子句 order by 子句 limit 子句;
五子句的顺序是固定的,不能颠倒
①.where 子句 ②.group by 子句 ③.having 子句 ④.order by 子句 ⑤.limit子句
6.模糊查询
SELECT uid, name FROM staffs WHERE name LIKE 'a%';
7.分页查询
当我们查询出来的数据量太大的时候,一页展示得又太多,一般情况下都会将其分成N页,那么这时候就需要用到分页查询。
SELECT * FROM staffs LIMIT 5, 10;
8.对SQL语句优化有哪些方法?
(1)Where子句中:where表之间的连接必须写在其他Where条件之前,那些可以过滤掉最大数量记录的条件必须写在Where子句的末尾.HAVING最后。
(2)用EXISTS替代IN、用NOT EXISTS替代NOT IN。
(3) 避免在索引列上使用计算
(4)避免在索引列上使用IS NULL和IS NOT NULL
(5)对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引。
(6)应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索引而进行全表扫描
(7)应尽量避免在 where 子句中对字段进行表达式操作,这将导致引擎放弃使用索引而进行全表扫描。
MySQL进阶
1.MySQL 基础架构
这道题应该从 MySQL 架构来理解,我们可以把 MySQL 拆解成几个零件,如下图所示

大致上来说,MySQL 可以分为 Server层和 存储引擎层。
Server 层包括连接器、查询缓存、分析器、优化器、执行器,包括大多数 MySQL 中的核心功能,所有跨存储引擎的功能也在这一层实现,包括 存储过程、触发器、视图等。
2.详细说一下一条 MySQL 语句执行的步骤
Server 层按顺序执行 SQL 的步骤为:
客户端请求 -> 连接器(验证用户身份,给予权限);
查询缓存(存在缓存则直接返回,不存在则执行后续操作);
分析器(对 SQL 进行词法分析和语法分析操作);
优化器(主要对执行的 SQL 优化选择最优的执行方案方法);
执行器(执行时会先看用户是否有执行权限,有才去使用这个引擎提供的接口)-> 去引擎层获取数据返回(如果开启查询缓存则会缓存查询结果);
3.Mysql中有哪几种锁?
1.表级锁:开销小,加锁快;不会出现死锁;锁定粒度大,发生锁冲突的概率最高,并发度最低。
2.行级锁:开销大,加锁慢;会出现死锁;锁定粒度最小,发生锁冲突的概率最低,并发度也最高。
3. 页面锁:开销和加锁时间界于表锁和行锁之间;会出现死锁;锁定粒度界于表锁和行锁之间,并发度一般。
4.优化数据库的方法
- 选取最适用的字段属性,尽可能减少定义字段宽度,尽量把字段设置NOTNULL,例如’省份’、’性别’最好适用ENUM
- 使用连接(JOIN)来代替子查询;
- 适用联合(UNION)来代替手动创建的临时表;
- 锁定表、优化事务处理;
- 适用外键,优化锁定表
- 建立索引;
- 优化查询语句;
5.MySQL主从复制模式
MySQL主从复制模式主要会包含:异步复制、半同步、以及全同步复制三种复制模式。
1.异步复制
MySQL默认的复制是异步的,主库在执行完客户端提交的事务后会立即将结果返给给客户端。
MySQL异步复制并不关心从库是否已经接收并处理,这样就会有一个问题,主如果crash掉了,此时主上已经提交的事务可能并没有传到从库上。
所以,后面又出来了一个半同步复制。
2.半同步复制
半同步复制介于异步复制和全同步复制之间,主库在执行完客户端提交的事务后不是立刻返回给客户端,而是等待至少一个从库接收到并写到relaylog中才返回给客户端。
如下图所示:

相对于异步复制,半同步复制提高了数据的安全性,同时它也造成了一定程度的延迟,这个延迟最少是一个TCP/IP往返的时间。
所以,半同步复制最好在低延时的网络中使用。
3.全同步复制
全同步复制:是指当主库执行完一个事务,然后所有的从库都复制了该事务并成功执行完才返回成功信息给客户端。
因为需要等待所有从库执行完该事务才能返回成功信息,所以全同步复制的性能必然会收到严重的影响。
mikechen
mikechen睿哥,10年+大厂架构经验,资深技术专家,就职于阿里巴巴、淘宝、百度等一线互联网大厂。
关注「mikechen」公众号,获取更多技术干货!

后台回复【架构】即可获取《阿里架构师进阶专题全部合集》,后台回复【面试】即可获取《史上最全阿里Java面试题总结》