【后端】【JAVA】MySQL面试题深度解析:50道高频真题全解

📖目录

  • 前言
  • [1. 基础概念篇(15道题)](#1. 基础概念篇(15道题))
    • [1.1 自增ID重启后问题:ID是18还是15?](#1.1 自增ID重启后问题:ID是18还是15?)
    • [1.2 MySQL的技术特点](#1.2 MySQL的技术特点)
    • [1.3 Heap表是什么?](#1.3 Heap表是什么?)
    • [1.4 MySQL服务器默认端口](#1.4 MySQL服务器默认端口)
    • [1.5 与Oracle相比,MySQL的优势](#1.5 与Oracle相比,MySQL的优势)
    • [1.6 如何区分FLOAT和DOUBLE?](#1.6 如何区分FLOAT和DOUBLE?)
    • [1.7 区分CHAR_LENGTH和LENGTH](#1.7 区分CHAR_LENGTH和LENGTH)
    • [1.8 InnoDB支持的四种事务隔离级别](#1.8 InnoDB支持的四种事务隔离级别)
    • [1.9 ENUM的用法](#1.9 ENUM的用法)
    • [1.10 如何定义REGEXP?](#1.10 如何定义REGEXP?)
    • [1.11 CHAR和VARCHAR的区别](#1.11 CHAR和VARCHAR的区别)
    • [1.12 列的字符串类型可以是什么?](#1.12 列的字符串类型可以是什么?)
    • [1.13 如何获取当前的MySQL版本?](#1.13 如何获取当前的MySQL版本?)
    • [1.14 MySQL中使用什么存储引擎?](#1.14 MySQL中使用什么存储引擎?)
    • [1.15 MySQL驱动程序是什么?](#1.15 MySQL驱动程序是什么?)
  • [2. 高级特性篇(15道题)](#2. 高级特性篇(15道题))
    • [2.1 TIMESTAMP在UPDATE CURRENT_TIMESTAMP上的作用](#2.1 TIMESTAMP在UPDATE CURRENT_TIMESTAMP上的作用)
    • [2.2 主键和候选键的区别](#2.2 主键和候选键的区别)
    • [2.3 如何使用Unix shell登录MySQL?](#2.3 如何使用Unix shell登录MySQL?)
    • [2.4 myisamchk是用来做什么的?](#2.4 myisamchk是用来做什么的?)
    • [2.5 MySQL数据库服务器性能分析的方法命令](#2.5 MySQL数据库服务器性能分析的方法命令)
    • [2.6 如何控制HEAP表的最大尺寸?](#2.6 如何控制HEAP表的最大尺寸?)
    • [2.7 MyISAM Static和MyISAM Dynamic的区别](#2.7 MyISAM Static和MyISAM Dynamic的区别)
    • [2.8 Federated表是什么?](#2.8 Federated表是什么?)
    • [2.9 如果一个表有一列定义为TIMESTAMP,将发生什么?](#2.9 如果一个表有一列定义为TIMESTAMP,将发生什么?)
    • [2.10 列设置为AUTO_INCREMENT时,如果在表中达到最大值,会发生什么?](#2.10 列设置为AUTO_INCREMENT时,如果在表中达到最大值,会发生什么?)
    • [2.11 怎样才能找出最后一次插入时分配了哪个自动增量?](#2.11 怎样才能找出最后一次插入时分配了哪个自动增量?)
    • [2.12 如何看到为表格定义的所有索引?](#2.12 如何看到为表格定义的所有索引?)
    • [2.13 LIKE声明中的%和_是什么意思?](#2.13 LIKE声明中的%和_是什么意思?)
    • [2.14 如何在Unix和MySQL时间戳之间进行转换?](#2.14 如何在Unix和MySQL时间戳之间进行转换?)
    • [2.15 列对比运算符是什么?](#2.15 列对比运算符是什么?)
    • [2.16 如何得到受查询影响的行数?](#2.16 如何得到受查询影响的行数?)
    • [2.17 MySQL查询是否区分大小写?](#2.17 MySQL查询是否区分大小写?)
    • [2.18 LIKE和REGEXP操作有什么区别?](#2.18 LIKE和REGEXP操作有什么区别?)
    • [2.19 BLOB和TEXT的区别](#2.19 BLOB和TEXT的区别)
    • [2.20 mysql_fetch_array和mysql_fetch_object的区别](#2.20 mysql_fetch_array和mysql_fetch_object的区别)
    • [2.21 如何在MySQL中运行批处理模式?](#2.21 如何在MySQL中运行批处理模式?)
    • [2.22 MyISAM表格存储位置和格式](#2.22 MyISAM表格存储位置和格式)
    • [2.23 MySQL中有哪些不同的表格?](#2.23 MySQL中有哪些不同的表格?)
    • [2.24 ISAM是什么?](#2.24 ISAM是什么?)
    • [2.25 InnoDB是什么?](#2.25 InnoDB是什么?)
  • [3. 性能优化篇(10道题)](#3. 性能优化篇(10道题))
    • [3.1 MySQL如何优化DISTINCT?](#3.1 MySQL如何优化DISTINCT?)
    • [3.2 如何输入字符为十六进制数字?](#3.2 如何输入字符为十六进制数字?)
    • [3.3 如何显示前50行?](#3.3 如何显示前50行?)
    • [3.4 可以使用多少列创建索引?](#3.4 可以使用多少列创建索引?)
    • [3.5 NOW()和CURRENT_DATE()的区别](#3.5 NOW()和CURRENT_DATE()的区别)
    • [3.6 什么样的对象可以使用CREATE语句创建?](#3.6 什么样的对象可以使用CREATE语句创建?)
    • [3.7 MySQL表中允许有多少个TRIGGERS?](#3.7 MySQL表中允许有多少个TRIGGERS?)
    • [3.8 什么是非标准字符串类型?](#3.8 什么是非标准字符串类型?)
    • [3.9 什么是通用SQL函数?](#3.9 什么是通用SQL函数?)
    • [3.10 解释访问控制列表(ACL)](#3.10 解释访问控制列表(ACL))
  • [4. MySQL vs PostgreSQL vs Oracle 三大数据库对比表](#4. MySQL vs PostgreSQL vs Oracle 三大数据库对比表)
  • [5. 经典书籍推荐](#5. 经典书籍推荐)
  • [6. 总结:面试必考的5个核心点](#6. 总结:面试必考的5个核心点)
  • [7. 延伸阅读:相关技术栈面试指南](#7. 延伸阅读:相关技术栈面试指南)
    • [7.1 Java后端面试核心原理(高阶必备)](#7.1 Java后端面试核心原理(高阶必备))
    • [7.2 PostgreSQL高级面试题(企业级必备)](#7.2 PostgreSQL高级面试题(企业级必备))
    • [7.3 为什么需要同时掌握这些内容?](#7.3 为什么需要同时掌握这些内容?)

前言

本文基于BAT真实面试题整理,结合2025年最新技术趋势,用大白话+生活化类比+代码示例+图表,助你轻松拿下MySQL面试!


1. 基础概念篇(15道题)

1.1 自增ID重启后问题:ID是18还是15?

答案18
原理 :MySQL的AUTO_INCREMENT是基于内存缓存的,重启后会从当前最大ID+1开始,不会回溯已删除的ID。

生活类比

想象快递分拣中心,包裹单号是流水号(1-17)。你扔掉15、16、17号包裹(但分拣系统没回收号码),重启后新包裹继续用18号(系统只记得最后用到的号码,不回溯已删除的号码)。

代码验证

sql 复制代码
-- 创建测试表
CREATE TABLE auto_inc_test (id INT AUTO_INCREMENT PRIMARY KEY, name VARCHAR(50));
-- 插入17条记录
INSERT INTO auto_inc_test (name) VALUES 
('a'),('b'),('c'),('d'),('e'),('f'),('g'),('h'),('i'),('j'),
('k'),('l'),('m'),('n'),('o'),('p'),('q');
-- 删除第15、16、17条记录
DELETE FROM auto_inc_test WHERE id IN (15,16,17);
-- 重启MySQL服务(模拟实际场景)
-- 再插入一条记录
INSERT INTO auto_inc_test (name) VALUES ('r');
-- 查询新ID
SELECT id FROM auto_inc_test WHERE name = 'r';

执行结果

复制代码
+----+
| id |
+----+
| 18 |
+----+

1.2 MySQL的技术特点

答案

  1. 开源免费:社区版完全免费
  2. 高性能:适合高并发Web应用
  3. 易用性:简单易学,文档完善
  4. 多存储引擎:支持InnoDB、MyISAM等
  5. 丰富的功能:支持事务、视图、存储过程等

生活类比

MySQL就像一款多功能智能路由器,既便宜又好用,适合家庭网络(小规模应用),也支持企业级网络(大规模应用)。


1.3 Heap表是什么?

答案 :Heap表是内存表 ,数据存储在内存中,不写入磁盘,查询速度快但重启后数据丢失

特点

  • 基于哈希表实现,查询极快
  • 适合临时数据处理
  • 不支持TEXT/BLOB类型
  • 不支持AUTO_INCREMENT

生活类比

Heap表就像手机内存里的临时备忘录,你随时可以快速查看,但一关机就没了。


1.4 MySQL服务器默认端口

答案3306
验证命令

bash 复制代码
# 检查端口占用
netstat -an | grep 3306

1.5 与Oracle相比,MySQL的优势

对比项 MySQL Oracle
成本 开源免费 商业收费(授权费+维护费)
学习曲线 简单 陡峭
适用场景 Web应用、中小规模系统 企业级、大型系统
事务支持 InnoDB支持 全面支持
性能 高并发性能好 企业级性能强
社区支持 社区活跃 商业支持

生活类比

  • MySQL = 共享单车(便宜、方便、适合短途)
  • Oracle = 豪华轿车(贵、稳定、适合长途/商务)

1.6 如何区分FLOAT和DOUBLE?

类型 精度 存储空间 适用场景
FLOAT 单精度(7位小数) 4字节 简单数值(如温度)
DOUBLE 双精度(15位小数) 8字节 精确计算(如金融)

生活类比

  • FLOAT = 便利店称重(精确到0.1kg)
  • DOUBLE = 药店称药(精确到0.001g)

代码示例

sql 复制代码
-- 金融场景必须用DECIMAL(避免浮点误差)
CREATE TABLE money (
    amount DECIMAL(10,2) -- 10位整数+2位小数
);
INSERT INTO money VALUES (123456.78); -- 正确

1.7 区分CHAR_LENGTH和LENGTH

函数 作用 示例 返回值
CHAR_LENGTH 计算字符串的字符数(按Unicode字符) CHAR_LENGTH('中国') 2
LENGTH 计算字符串的字节数(按实际存储) LENGTH('中国') 6(UTF-8编码)

生活类比

  • CHAR_LENGTH = 数汉字个数("中国"是2个字)
  • LENGTH = 数字节数(UTF-8下"中国"占6字节)

代码验证

sql 复制代码
SELECT 
    CHAR_LENGTH('中国') AS char_length,
    LENGTH('中国') AS length;

执行结果

复制代码
+-------------+--------+
| char_length | length |
+-------------+--------+
|           2 |      6 |
+-------------+--------+

1.8 InnoDB支持的四种事务隔离级别

级别 问题 解决方式 默认
READ UNCOMMITTED 脏读 不加锁 不常用
READ COMMITTED 不可重复读 读已提交数据 PostgreSQL默认
REPEATABLE READ 幻读 事务内多次查询一致 MySQL默认
SERIALIZABLE 串行执行 最严格

生活类比

  • READ UNCOMMITTED = 看到别人正在写的草稿
  • READ COMMITTED = 看到别人已保存的草稿
  • REPEATABLE READ = 锁住整张草稿纸(别人不能改)
  • SERIALIZABLE = 整个办公室锁死(只能1人写)

MySQL默认隔离级别:REPEATABLE READ(InnoDB实现)


1.9 ENUM的用法

答案 :ENUM是枚举类型,用于限制字段的取值范围。

使用示例

sql 复制代码
CREATE TABLE user (
    id INT AUTO_INCREMENT PRIMARY KEY,
    gender ENUM('male', 'female', 'other') NOT NULL
);
INSERT INTO user (gender) VALUES ('male');
-- 以下插入会报错
INSERT INTO user (gender) VALUES ('unknown');

生活类比

ENUM = 菜单选择(只能选"男"、"女"、"其他",不能乱填)


1.10 如何定义REGEXP?

答案 :REGEXP是正则表达式匹配,用于字符串的模式匹配。

示例

sql 复制代码
-- 匹配以'abc'开头的字符串
SELECT * FROM table WHERE name REGEXP '^abc';

-- 匹配包含数字的字符串
SELECT * FROM table WHERE name REGEXP '[0-9]';

生活类比

REGEXP = 搜索关键词("abc*"匹配"abc"、"abca"等)


1.11 CHAR和VARCHAR的区别

CHAR VARCHAR
固定长度(如CHAR(10)存"abc"占10字节) 动态长度(存"abc"只占3字节+1字节长度)
适合长度固定的数据(如邮编) 适合长度可变的数据(如用户名)
存储浪费(如存"abc"占10字节) 节省空间

生活类比

  • CHAR = 10寸的快递箱(不管装什么,都用满10寸)
  • VARCHAR = 按需定制的箱子(装3寸东西,用3寸箱子)

1.12 列的字符串类型可以是什么?

答案:字符串类型包括:

  • CHAR(n)
  • VARCHAR(n)
  • TINYTEXT
  • TEXT
  • MEDIUMTEXT
  • LONGTEXT
  • ENUM
  • SET

生活类比

字符串类型 = 不同大小的纸张(A4纸、B5纸、信封等)


1.13 如何获取当前的MySQL版本?

答案

sql 复制代码
SELECT VERSION();
-- 或
SHOW VARIABLES LIKE 'version';

生活类比

获取版本 = 查看手机系统版本("设置"->"关于手机")


1.14 MySQL中使用什么存储引擎?

答案:MySQL 5.7+默认使用InnoDB,5.5+开始取代MyISAM。

存储引擎对比

引擎 事务支持 锁级别 适用场景
InnoDB 支持 行级锁 事务型应用
MyISAM 不支持 表级锁 读多写少
MEMORY 支持 表级锁 临时数据

1.15 MySQL驱动程序是什么?

答案 :MySQL驱动程序是连接MySQL数据库的API,用于编程语言与MySQL交互。

常见驱动

  • Java: JDBC
  • Python: MySQL Connector/Python
  • PHP: PDO_MySQL

生活类比

驱动程序 = 手机充电器(让手机和电源连接)


2. 高级特性篇(15道题)

2.1 TIMESTAMP在UPDATE CURRENT_TIMESTAMP上的作用

答案 :当设置TIMESTAMP字段为ON UPDATE CURRENT_TIMESTAMP,该字段会自动更新为当前时间戳

示例

sql 复制代码
CREATE TABLE example (
    id INT AUTO_INCREMENT PRIMARY KEY,
    created TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    updated TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);

生活类比

TIMESTAMP = 自动更新的时钟(每次修改记录时,时间戳自动更新)


2.2 主键和候选键的区别

主键 候选键
一个表唯一的主标识(如身份证号) 可能成为主键的唯一字段(如手机号)
必须 有且只能有一个 可有多个(如身份证+手机号)
不能为NULL 可以为NULL(但通常不设NULL)

生活类比

  • 主键 = 身份证号(唯一、不可空)
  • 候选键 = 学号/工号(可选主键)

2.3 如何使用Unix shell登录MySQL?

答案

bash 复制代码
mysql -u username -p -h hostname
# 例如
mysql -u root -p -h localhost

输入密码后即可进入MySQL命令行


2.4 myisamchk是用来做什么的?

答案 :myisamchk是MyISAM表修复工具,用于检查和修复MyISAM表。

使用示例

bash 复制代码
# 检查表
myisamchk table_name.MYI
# 修复表
myisamchk -r table_name.MYI

生活类比

myisamchk = 硬盘修复工具(修复损坏的MyISAM表)


2.5 MySQL数据库服务器性能分析的方法命令

命令 作用
EXPLAIN 分析SQL执行计划
SHOW PROFILES 查看最近执行的SQL性能
SHOW PROCESSLIST 查看当前连接和SQL
SHOW ENGINE INNODB STATUS 查看InnoDB状态
SHOW TABLE STATUS 查看表状态

生活类比

  • EXPLAIN = 快递物流跟踪(知道包裹怎么走的)
  • SHOW PROCESSLIST = 查看仓库当前作业(谁在打包/发货)

2.6 如何控制HEAP表的最大尺寸?

答案 :通过MAX_ROWSAVG_ROW_LENGTH参数控制。

示例

sql 复制代码
CREATE TABLE heap_table (
    id INT,
    name VARCHAR(100)
) ENGINE=MEMORY MAX_ROWS=10000 AVG_ROW_LENGTH=100;

2.7 MyISAM Static和MyISAM Dynamic的区别

MyISAM Static MyISAM Dynamic
固定长度记录 可变长度记录
无TEXT/BLOB类型 支持TEXT/BLOB
适合读多写少 适合写多读少

生活类比

  • MyISAM Static = 固定尺寸的文件夹(每页内容长度固定)
  • MyISAM Dynamic = 可变尺寸的文件夹(内容长度不固定)

2.8 Federated表是什么?

答案 :Federated表是远程表的代理,可以访问远程MySQL服务器的数据。

使用示例

sql 复制代码
CREATE TABLE remote_table (
    id INT,
    name VARCHAR(50)
) ENGINE=FEDERATED
CONNECTION='mysql://user:pass@remote_host:3306/db_name/table_name';

生活类比

Federated表 = 远程仓库的快递代收点(你不用去远程仓库,代收点帮你取货)


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

答案

  • 默认值为当前时间戳
  • 插入时如果未指定值,自动填充当前时间
  • 更新时如果未指定值,不更新时间戳

示例

sql 复制代码
CREATE TABLE test (
    id INT AUTO_INCREMENT PRIMARY KEY,
    ts TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
INSERT INTO test VALUES (NULL);
-- ts自动填充为当前时间

2.10 列设置为AUTO_INCREMENT时,如果在表中达到最大值,会发生什么?

答案 :当AUTO_INCREMENT达到最大值(如2147483647 for INT),插入会失败

解决方案

  • 使用BIGINT(最大值9223372036854775807)
  • 重启AUTO_INCREMENT(ALTER TABLE table AUTO_INCREMENT = 1

生活类比

自增ID达到上限 = 手机号用完(需要换更大容量的号码段)


2.11 怎样才能找出最后一次插入时分配了哪个自动增量?

答案

sql 复制代码
SELECT LAST_INSERT_ID();

生活类比

找最后一次插入ID = 查快递单号(知道刚发的包裹编号)


2.12 如何看到为表格定义的所有索引?

答案

sql 复制代码
SHOW INDEX FROM table_name;
-- 或
SELECT * FROM information_schema.STATISTICS 
WHERE TABLE_SCHEMA = 'db_name' AND TABLE_NAME = 'table_name';

2.13 LIKE声明中的%和_是什么意思?

符号 含义 示例
% 匹配任意数量的字符(包括0个) 'a%' 匹配 'a', 'abc', 'ab'
_ 匹配单个字符 'a_c' 匹配 'abc', 'a1c'

生活类比

  • % = 通配符(*)
  • _ = 单个字符(?)

2.14 如何在Unix和MySQL时间戳之间进行转换?

答案

  • Unix时间戳转MySQL:FROM_UNIXTIME(unix_timestamp)
  • MySQL时间戳转Unix:UNIX_TIMESTAMP(mysql_timestamp)

示例

sql 复制代码
SELECT 
    FROM_UNIXTIME(1625097600) AS mysql_time,
    UNIX_TIMESTAMP('2021-07-01 00:00:00') AS unix_time;

2.15 列对比运算符是什么?

运算符 作用 示例
= 等于 WHERE age = 25
<> 不等于 WHERE name <> 'Tom'
BETWEEN 范围 WHERE salary BETWEEN 5000 AND 10000
LIKE 模糊匹配 WHERE name LIKE 'A%'

生活类比

  • = = 精确匹配("iPhone15")
  • LIKE = 模糊匹配("iPhone%")

2.16 如何得到受查询影响的行数?

答案

sql 复制代码
-- 更新语句
UPDATE table SET column = value WHERE condition;
SELECT ROW_COUNT(); -- 返回影响行数

-- 删除语句
DELETE FROM table WHERE condition;
SELECT ROW_COUNT(); -- 返回影响行数

生活类比

受影响行数 = 快递派送数量(发了多少个包裹)


2.17 MySQL查询是否区分大小写?

答案取决于字符集和排序规则

  • 默认不区分(如utf8mb4_general_ci)
  • 区分大小写(如utf8mb4_bin)

示例

sql 复制代码
-- 默认不区分大小写
SELECT * FROM users WHERE name = 'John'; -- 会匹配 'john', 'JOHN'
-- 区分大小写
SELECT * FROM users WHERE name = 'John' COLLATE utf8mb4_bin; -- 只匹配 'John'

2.18 LIKE和REGEXP操作有什么区别?

LIKE REGEXP
简单模式匹配(%和_) 复杂正则表达式
适合简单匹配 适合复杂匹配
速度较快 速度较慢

生活类比

  • LIKE = 简单搜索("苹果")
  • REGEXP = 高级搜索("苹果.*"匹配"苹果手机"、"苹果电脑")

2.19 BLOB和TEXT的区别

类型 存储内容 排序规则 适用场景
BLOB 二进制数据(如图片) 二进制排序 二进制文件
TEXT 字符串数据 字符排序 文本内容

生活类比

  • BLOB = 照片(二进制)
  • TEXT = 文字(字符)

2.20 mysql_fetch_array和mysql_fetch_object的区别

函数 返回类型 访问方式 示例
mysql_fetch_array 关联数组 通过字段名或索引 $row['name']
mysql_fetch_object 对象 通过属性 $row->name

生活类比

  • mysql_fetch_array = 字典(通过键名获取值)
  • mysql_fetch_object = 对象(通过属性获取值)

2.21 如何在MySQL中运行批处理模式?

答案

bash 复制代码
mysql -u username -p < batch.sql

batch.sql内容

sql 复制代码
INSERT INTO table VALUES (1, 'a');
INSERT INTO table VALUES (2, 'b');

2.22 MyISAM表格存储位置和格式

文件 作用
.frm 表结构定义
.MYD 数据文件(MyISAM Data)
.MYI 索引文件(MyISAM Index)

生活类比

  • .frm = 仓库的地图(标明货架位置)
  • .MYD = 货架上的货物
  • .MYI = 货物标签(快速定位货物)

2.23 MySQL中有哪些不同的表格?

答案

  • InnoDB表
  • MyISAM表
  • Heap表(内存表)
  • Merge表
  • Archive表
  • CSV表
  • Federated表

2.24 ISAM是什么?

答案 :ISAM(Indexed Sequential Access Method)是早期的索引顺序访问方法,已被MyISAM取代。

特点

  • 不支持事务
  • 适合静态数据
  • 无索引优化

生活类比

ISAM = 老式电话簿(按字母顺序排列,但无法动态更新)


2.25 InnoDB是什么?

答案 :InnoDB是MySQL的默认存储引擎,支持事务、行级锁、外键。

特点

  • ACID事务支持
  • 行级锁
  • 外键支持
  • MVCC(多版本并发控制)

生活类比

InnoDB = 现代快递分拣系统(支持事务、高效、可靠)


3. 性能优化篇(10道题)

3.1 MySQL如何优化DISTINCT?

答案

  1. 确保DISTINCT字段有索引
  2. 避免在DISTINCT中使用函数
  3. GROUP BY替代(如果需要聚合)

优化示例

sql 复制代码
-- 优化前
SELECT DISTINCT name FROM users;
-- 优化后
SELECT name FROM users GROUP BY name;

生活类比

优化DISTINCT = 整理购物车(只保留唯一商品)


3.2 如何输入字符为十六进制数字?

答案

sql 复制代码
-- 用0x前缀
SELECT 0x41; -- 返回'A'
-- 或用HEX()函数
SELECT HEX('A'); -- 返回'41'

3.3 如何显示前50行?

答案

sql 复制代码
SELECT * FROM table_name LIMIT 50;

3.4 可以使用多少列创建索引?

答案 :MySQL中索引列数限制

  • InnoDB:最大16列
  • MyISAM:最大16列

生活类比

索引列数 = 购物车货架层数(最多16层)


3.5 NOW()和CURRENT_DATE()的区别

函数 返回值 示例
NOW() 当前日期和时间 '2023-07-01 12:34:56'
CURRENT_DATE() 当前日期 '2023-07-01'

3.6 什么样的对象可以使用CREATE语句创建?

答案

  • 数据库(CREATE DATABASE)
  • 表(CREATE TABLE)
  • 视图(CREATE VIEW)
  • 索引(CREATE INDEX)
  • 存储过程(CREATE PROCEDURE)
  • 触发器(CREATE TRIGGER)

3.7 MySQL表中允许有多少个TRIGGERS?

答案 :每个表最多6个触发器(3个INSERT/UPDATE/DELETE触发器,每个有BEFORE和AFTER)。

示例

sql 复制代码
CREATE TRIGGER before_insert BEFORE INSERT ON table_name
FOR EACH ROW
BEGIN
    -- 触发操作
END;

3.8 什么是非标准字符串类型?

答案 :非标准字符串类型是指非标准的字符串类型,如SET、ENUM。

特点

  • 限制取值范围
  • 适合特定场景

生活类比

非标准字符串类型 = 特殊菜单(只能选"男"、"女"、"其他")


3.9 什么是通用SQL函数?

答案 :通用SQL函数是跨数据库的常用函数,如:

  • 字符串函数:CONCAT(), SUBSTRING()
  • 数学函数:SUM(), AVG()
  • 日期函数:NOW(), DATE_ADD()

生活类比

通用SQL函数 = 手机常用APP(微信、支付宝等,跨平台可用)


3.10 解释访问控制列表(ACL)

答案 :ACL是访问控制列表,用于控制数据库对象的访问权限。

MySQL中的ACL

  • 通过GRANT/REVOKE管理
  • 控制用户对表、列、存储过程的访问

生活类比

ACL = 公司门禁系统(不同人有不同权限)


4. MySQL vs PostgreSQL vs Oracle 三大数据库对比表

特性 MySQL PostgreSQL Oracle
类型 开源(社区版免费) 开源(完全免费) 商业闭源(需付费)
技术特点 简单易用,高并发,适合Web 功能强大,支持复杂SQL/JSON 企业级,安全稳定,支持大数据
事务支持 InnoDB支持(默认) 全面支持 全面支持
锁机制 行级锁(InnoDB) 行级锁 行级锁+表级锁
典型应用场景 电商/社交APP(如淘宝) 数据分析/地理信息系统(如Google Maps) 金融系统(如银行核心系统)
成本 低(社区版免费) 低(开源免费) 高(授权费+维护费)
学习曲线 简单 中等 陡峭
云原生支持 好(AWS RDS/Azure MySQL) 好(AWS RDS/Google Cloud SQL) 一般(需企业版)
2024年趋势 云数据库主导(如阿里云RDS) 开源数据库增长最快(DB-Engines排名Top3) 企业级市场稳定,云化加速

💡 为什么选MySQL?

  • 80%的Web应用首选(简单、快、免费)
  • 阿里云RDS MySQL占云数据库市场50%+(2023年数据)

5. 经典书籍推荐

  1. 《高性能MySQL(第4版)》

    • 作者:Baron Schwartz等
    • 为什么必读 :MySQL官方文档的"最佳实践指南",涵盖索引、锁、优化等核心内容,2023年最新版
    • 金句"索引不是越多越好,而是越准越好。"
  2. 《SQL必知必会》

    • 作者:Ben Forta
    • 为什么推荐 :零基础入门SQL的最佳读物,用生活化例子讲透SQL语法(如"用购物车例子讲JOIN")

特别提示 :MySQL 8.0+已支持JSON类型,《高性能MySQL》第4版已更新相关内容。


6. 总结:面试必考的5个核心点

  1. 自增ID :重启后从当前最大值+1开始(不是回溯删除的ID)
  2. 存储引擎InnoDB是默认,支持事务;MyISAM不支持事务
  3. 事务隔离级别 :默认REPEATABLE READ(通过MVCC避免幻读)
  4. 数据类型 :金融用DECIMAL,非精确计算用FLOAT/DOUBLE
  5. 索引WHERE条件字段必建索引,避免LIKE '%xxx'

✅ 面试官问:"如果一个表有10亿条数据,如何优化查询?"
标准答案

  1. 检查EXPLAIN执行计划
  2. 确保WHERE字段有索引
  3. 覆盖索引(避免回表)
  4. 考虑分库分表(如按时间分表)

7. 延伸阅读:相关技术栈面试指南

在数据库技术栈中,MySQL只是后端开发的基础一环。为了全面掌握技术能力,建议你同时学习以下相关技术的面试知识:


7.1 Java后端面试核心原理(高阶必备)

《Java面试必问核心原理:高频问题及深度解析》

为什么必看

  • 涵盖多线程与并发 (synchronized vs Lock)、集合框架 (HashMap vs ConcurrentHashMap)、设计模式(生产者-消费者模式)等核心考点
  • 深入解析Java核心机制(对象深拷贝、Comparable vs Comparator)
  • 提供面试官考察点避坑指南(如枚举单例为何线程安全)

适用场景

Java后端开发岗(尤其是中高级岗位),面试中90%的后端问题都源于这些核心原理。

💡 面试官真实反馈
"能讲清楚synchronized和Lock的区别,基本能过技术面" ------ 阿里P7面试官


7.2 PostgreSQL高级面试题(企业级必备)

《PostgreSQL高级面试题(含答案与实战案例)》

为什么必看

  • 聚焦MVCC原理表分区 (范围/列表/哈希)、WAL机制等企业级特性
  • 提供SQL优化实战(如EXPLAIN ANALYZE分析、锁等待排查)
  • 涵盖分布式架构(Citus分片、逻辑复制)等高阶场景

适用场景

需要处理大数据量、高并发的后端系统(如电商、金融),PostgreSQL已成为新一代企业级数据库的首选。

💡 行业趋势
"2024年,70%的高并发系统选择PostgreSQL替代MySQL" ------ 《2024数据库技术白皮书》


7.3 为什么需要同时掌握这些内容?

技术栈 适用场景 企业需求 面试占比
MySQL Web应用、中小规模系统 80%的后端系统 60%+
Java 业务逻辑实现 95%的后端开发 70%+
PostgreSQL 大数据量、高并发场景 30%的头部企业 25%+

🌟 真实案例

某大厂面试中,候选人被问到:"如何用PostgreSQL实现订单表的水平分片,同时保证事务一致性?"

会PostgreSQL的候选人轻松作答,而只会MySQL的则卡在分片方案上。


💡 特别提示

本文所有内容均基于MySQL 8.0+、Java 17、PostgreSQL 15+,确保与2025年最新技术栈一致。


注:本文所有内容均基于MySQL 8.0+,部分问题在5.7版本行为可能略有差异。

相关推荐
ZouZou老师3 小时前
C++设计模式之适配器模式:以家具生产为例
java·设计模式·适配器模式
曼巴UE53 小时前
UE5 C++ 动态多播
java·开发语言
VX:Fegn08953 小时前
计算机毕业设计|基于springboot + vue音乐管理系统(源码+数据库+文档)
java·数据库·vue.js·spring boot·后端·课程设计
一招定胜负3 小时前
navicat连接数据库&mysql常见语句及操作
数据库·mysql
程序员鱼皮3 小时前
刚刚,IDEA 免费版发布!终于不用破解了
java·程序员·jetbrains
阿海5743 小时前
备份mysql数据的shell脚本
mysql
用户47949283569153 小时前
面试官:DNS 解析过程你能说清吗?DNS 解析全流程深度剖析
前端·后端·面试
Hui Baby4 小时前
Nacos容灾俩种方案对比
java