MySQL 进阶 面经级
会用数据库,找大厂工作是远远不够的。
本人2025美团暑期AI面试好几个MySQL场景问题不会答,已脏面评。遂在此整理学习!
文章目录
- 分片分区
- 分区语法
- 范围分区 (RANGE Partitioning)
- 列表分区(LIST Partitioning)
- 哈希分区(HASH Partitioning)
- 键分区(KEY Partitioning)
- 子分区
- 2025 美团AI面
- 1.数据库分片sharding的概念,它有什么优势和挑战?
- 优势
- Sharding 挑战
- 2. 分库分表的常见策略有哪些
- a. 取模分片
- b. 范围分片
- c. 按业务
- d. 按时间分
- e. 混合分片
- 3.数据库分页,千万级数据,如何解决深度分页的效率问题
- a. 避免 OFFSET 直接跳过大量数据
- b. 分区优化查询
- c. 缓存分页结果
- 4. 如果一条SQL查询变慢,你的优化步骤是什么?
- EXPLAIN
分片分区
-
分片 Sharding 是跨多个物理机器,把数据拆分到不同的服务器上
-
分区 Partitioning 是在单个数据库内部,把一张大表拆成多个物理存储的分区。
对用户仍然表现为一张表,查询时数据库自动优化查询范围。
分区语法
PARTITION BY
范围分区 (RANGE Partitioning)
-- 创建一个按范围分区的表
CREATE TABLE sales (id INT,sale_date DATE,amount DECIMAL(10, 2)
)
PARTITION BY RANGE (YEAR(sale_date)) (PARTITION p2020 VALUES LESS THAN (2021),PARTITION p2021 VALUES LESS THAN (2022),PARTITION p2022 VALUES LESS THAN (2023),PARTITION p2023 VALUES LESS THAN (2024),PARTITION p2024 VALUES LESS THAN (2025),PARTITION p_other VALUES LESS THAN MAXVALUE
);
列表分区(LIST Partitioning)
根据指定列是否为特定值,分区
-- 创建一个按列表分区的表
CREATE TABLE products (id INT,category VARCHAR(50),price DECIMAL(10, 2)
)
PARTITION BY LIST (category) (PARTITION p_electronics VALUES IN ('Laptop', 'Smartphone', 'Tablet'),PARTITION p_clothing VALUES IN ('T-Shirt', 'Jeans', 'Dress'),PARTITION p_home VALUES IN ('Furniture', 'Appliance')
);
哈希分区(HASH Partitioning)
适用于数值类型
不强制要求主键或索引
-- 创建一个按哈希分区的表
CREATE TABLE orders (id INT,order_date DATE,total_amount DECIMAL(10, 2)
)
PARTITION BY HASH (id)
PARTITIONS 4;
键分区(KEY Partitioning)
使用的 MySQL 内部的哈希函数,适用于任何数据类型(VARCHAR),允许 多个列组合 作为 KEY。
MySQL 要求分区键是主键或唯一索引
(经过分析,必要性只体现在数据分布均匀和查询效率上。)
-- 创建一个按键分区的表
CREATE TABLE customers (id INT,name VARCHAR(100),email VARCHAR(100)
)
PARTITION BY KEY (id)
PARTITIONS 3;
子分区
SUBPARTITION
先分一步,再分第二步
-- 创建一个带有子分区的表
CREATE TABLE events (id INT,event_date DATE,event_type VARCHAR(50)
)
PARTITION BY RANGE (YEAR(event_date))
SUBPARTITION BY HASH (MONTH(event_date))
SUBPARTITIONS 2 (PARTITION p2023 VALUES LESS THAN (2024),PARTITION p2024 VALUES LESS THAN (2025)
);
2025 美团AI面
1.数据库分片sharding的概念,它有什么优势和挑战?
我当时甚至不清楚分片啥意思——其实就是分布式数据库,将数据拆分到多个数据库节点上。
每个数据库节点存储数据的一个子集,被称为分片(Shard)。
优势
-
水平扩展,能够支持海量数据
-
提高性能:
- 多个数据库节点可以并行处理查询和写入请求,减少单个数据库的负载。
- 每个分片只存储部分数据,索引体积更小,提高查询效率。
- 隔离
单个分片出现故障,不会影响其他分片的数据
Sharding 挑战
- 怎么分?
需要选择合适的分片键(Shard Key),否则:
数据倾斜:部分分片存储的数据量过大,导致查询压力集中,影响性能。
查询跨分片:如果查询涉及多个分片(如 JOIN、GROUP BY),可能导致性能下降。
- 维护
随着数据增长,可能需要重新分片。数据迁移过程复杂,可能影响在线业务。
需要额外的工具监控各个分片的健康状况,防止单点瓶颈。
- 跨分片问题
联合只能在应用层。
跨分片事务,需要引入两阶段提交(2PC)等机制。而且要保证数据一致性。
2. 分库分表的常见策略有哪些
延续上一个问题了,,
a. 取模分片
num % 3 == 0/1/2
✅ 数据均匀
❌ 拓展困难,模数想跳转只能重新计算。
范围查询表现不佳
b. 范围分片
每10W个编号分到一个数据库中
✅ 支持数据查询,扩展方便
❌ 数据倾斜风险:可能部分连续数据访问量大,分片压力大
c. 按业务
常规,不要宽列
d. 按时间分
日志,订单等
e. 混合分片
先分用户表,再对其取模分片,再按时间分
3.数据库分页,千万级数据,如何解决深度分页的效率问题
a. 避免 OFFSET 直接跳过大量数据
假设 id 有索引,获取 id 1000000 ~ 1000020
SELECT id, name, age FROM users
ORDER BY id LIMIT 1000000, 20;
这里即使跳过了前100万行,仍需扫描其他列,导致类似回表的性能开销。
(除非这三列是联合索引)
利用子查询索引加速分页:
SELECT id, name, age FROM users
WHERE id > (SELECT id FROM users ORDER BY id LIMIT 1000000, 1)
ORDER BY id LIMIT 20;
子查询 SELECT id FROM users ORDER BY id LIMIT 1000000, 1 仅需访问主键索引(覆盖索引),无需回表。
如果 id 是递增,可以不使用 OFFSET:
SELECT * FROM users
WHERE id > 5000000 -- 这个值从前一页查询获取
ORDER BY id
LIMIT 20;
b. 分区优化查询
(分区不是分片,见1.)
PARTITION BY RANGE (created_at) 指定了按 created_at 进行范围分区
CREATE ... PARTITION OF [table] FOR VALUES FROM
CREATE TABLE users (id BIGINT NOT NULL,name VARCHAR(255),age INT,created_at TIMESTAMP,PRIMARY KEY (id, created_at)
) PARTITION BY RANGE (created_at);CREATE TABLE users_2024 PARTITION OF users FOR VALUES FROM ('2024-01-01') TO ('2025-01-01');
c. 缓存分页结果
适用于只读或更新较少的数据。
CREATE ... AS
CREATE TABLE user_pagination_cache AS
SELECT id FROM users ORDER BY id LIMIT 10000000;
4. 如果一条SQL查询变慢,你的优化步骤是什么?
保存 复现语句,看是特定查询慢还是整个库慢
EXPLAIN
EXPLAIN 关键字可用于分析 SQL 查询的执行计划,了解数据库是如何执行查询的:表的访问顺序、使用的索引、数据扫描方式
EXPLAIN SELECT * FROM users WHERE age > 25;
-
优化查询语句,在多表连接查询中,合理安排表的连接顺序,让数据库先连接小表,减少中间结果集的大小。
-
避免在查询条件中使用函数或表达式,因为这可能会导致索引失效。
-- 不好的写法,索引可能失效
SELECT * FROM users WHERE YEAR(birth_date) = 1990;
-- 好的写法,可使用索引
SELECT * FROM users WHERE birth_date BETWEEN '1990-01-01' AND '1990-12-31';
-
确保数据库的数据文件和日志文件存储在高性能的磁盘上,避免磁盘 I/O 成为性能瓶颈
-
确保表的结构合理,避免数据冗余和过度规范化
相关文章:
MySQL 进阶 面经级
会用数据库,找大厂工作是远远不够的。 本人2025美团暑期AI面试好几个MySQL场景问题不会答,已脏面评。遂在此整理学习! 文章目录 分片分区分区语法范围分区 (RANGE Partitioning)列表分区(LIST Partitionin…...
《C奥林匹斯宝典:基础篇 - 重载函数》
一、重载函数 (一)函数模板重载 详细解析:函数模板提供了一种通用的函数定义方式,可针对不同类型进行实例化。当存在函数模板与普通函数、其他函数模板同名时,就构成了函数模板重载。编译器在编译阶段,依…...
【408--考研复习笔记】计算机网络----知识点速览
目录 一、计算机网络体系结构 1.计算机网络的定义与功能: 2.网络体系结构相关概念: 3.OSI 七层模型与 TCP/IP 模型: 4.通信方式与交换技术: 电路交换 报文交换 分组交换 5.端到端通信和点到点通信: 6.计算机…...
TiDB 可观测性解读(二)丨算子执行信息性能诊断案例分享
导读 可观测性已经成为分布式系统成功运行的关键组成部分。如何借助多样、全面的数据,让架构师更简单、高效地定位问题、分析问题、解决问题,已经成为业内的一个技术焦点。本系列文章将深入解读 TiDB 的关键参数,帮助大家更好地观测系统的状…...
15:00开始面试,15:08就出来了,问的问题有点变态。。。
从小厂出来,没想到在另一家公司又寄了。 到这家公司开始上班,加班是每天必不可少的,看在钱给的比较多的份上,就不太计较了。没想到8月一纸通知,所有人不准加班,加班费不仅没有了,薪资还要降40%…...
蓝桥杯准备(前缀和差分)
import java.util.Scanner; public class qianzhuihe {public static void main(String[] args) {int N,M;Scanner scnew Scanner(System.in);Nsc.nextInt();Msc.nextInt();int []treesnew int[N1];//设为N1的意义,防止越界int []prefixSumnew int[N1];for(int i1;i…...
试用thymeleaf引入vue-element-admin(一)
作为后端程序员,一直使用springbootbootstarp做管理系统,对前端不是太了解,现在感觉bootstarp的admin ui一直不得劲,想切换成前端使用较多的ui,费了老鼻子劲。 我的目的不是前后端分离,而是一个人全栈&…...
Minimind 训练一个自己专属语言模型
发现了一个宝藏项目, 宣传是完全从0开始,仅用3块钱成本 2小时!即可训练出仅为25.8M的超小语言模型MiniMind,最小版本体积是 GPT-3 的 17000,做到最普通的个人GPU也可快速训练 https://github.com/jingyaogong/minimi…...
C++11QT复习 (七)
智能指针雏形 **Day7-1 智能指针雏形:独占语义与共享语义****1. 独占语义与共享语义****1.1 Circle 类:示例类** **2. 拷贝构造:独占语义(Unique Ownership)****2.1 代码解析** **3. 拷贝构造:共享语义&…...
STM32八股【5】----- TIM定时器
1. TIM定时器分类 STM32 的定时器主要分为以下几类: 高级定时器(Advanced TIM,TIM1/TIM8) 具备 PWM 生成、死区控制、互补输出等高级功能,适用于电机控制和功率转换应用。通用定时器(General-purpose TIM…...
单元测试之Arrange-Act-Assert(简称AAA)
Arrange-Act-Assert(简称AAA)是一种编写单元测试的标准模式,具有清晰的结构和明确的步骤,有助于提高测试的可读性、可维护性和可扩展性。以下是对每个步骤的详细说明: 1. Arrange(准备阶段) 在…...
厘米级定位赋能智造升级:品铂科技UWB技术驱动工厂全流程自动化与效能跃升”
在智能制造中的核心价值体现在高精度定位、流程优化、安全管理等多个维度,具体应用如下: 一、核心技术与定位能力 厘米级高精度定位 UWB技术通过纳秒级窄脉冲信号(带宽超500MHz)实现高时间分辨率,结合…...
C++刷题(四):vector
📝前言说明: 本专栏主要记录本人的基础算法学习以及刷题记录,使用语言为C。 每道题我会给出LeetCode上的题号(如果有题号),题目,以及最后通过的代码。没有题号的题目大多来自牛客网。对于题目的…...
学习记录706@微信小程序+springboot项目 真机测试 WebSocket错误: {errMsg: Invalid HTTP status.}连接不上
我微信小程序springboot项目 真机测试 websocket 总是报错 WebSocket错误: {errMsg: Invalid HTTP status.},总是连接不上,但是开发者工具测试就没有问题。 最后解决方案是编码token,之前是没有编码直接拼接的,原因不详。 consol…...
【虚拟仪器技术】Labview虚拟仪器技术应用教程习题参考答案[13页]
目录 第1章 第2章 第3章 第4章 第5章 第6章 第7章 第8章 第1章 1. 简述虚拟仪器概念。 参考答案:虚拟仪器是借助于强大的计算机软件和硬件环境的支持,建立虚拟的测试仪器面板,完成仪器的控制、数…...
【工作梳理】怎么把f12里面的东西导入到postman
postman左上角导入 结果:...
UE5学习笔记 FPS游戏制作34 触发器切换关卡
文章目录 搭建关卡制作触发器传送门显示加载界面 搭建关卡 首先搭建两个关卡,每个关卡里至少要有一个角色 制作触发器传送门 1 新建一个蓝图,父类为actor,命名为portal(传送门) 2 为portal添加一个staticMesh&#…...
智谱大模型(ChatGLM3)PyCharm的调试指南
前言 最近在看一本《ChatGLM3大模型本地化部署、应用开发和微调》,本文就是讨论ChatGLM3在本地的初步布设。(模型文件来自魔塔社区) 1、建立Pycharm工程 采用的Python版本为3.11 2、安装对应的包 2.1、安装modelscope包 pip install model…...
新专栏预告 《AI大模型应知应会短平快系列100篇》 - 整体规划设计
做个预告,为系统化梳理AI大模型的发展脉络,并为普及AI素养做一点贡献,特给自己制定了一个小目标,3个月内完成交稿。 AI大模型应知应会短平快系列100篇 - 整体规划设计 一、基础知识模块(20篇) 1.1 大模型…...
SwanLab Slack通知插件:让AI训练状态同步更及时
在AI模型训练的过程中,开发者常常面临一个难题:如何及时跟踪训练状态?无论是实验超参数的调整、关键指标的变化,还是意外中断的告警,传统的监控方式往往依赖手动刷新日志或反复检查终端,这不仅效率低下&…...
收集 的 JavaScript 数组方法表格
这个表格可以作为数组方法的快速参考指南 方法名对应版本功能原数组是否改变返回值类型concat()ES5-合并数组,并返回合并之后的新数组nArrayjoin()ES5-使用分隔符,将数组转为字符串并返回nStringpop()ES5-删除最后一位,并返回删除的数据yAny…...
操作系统高频(六)linux内核
操作系统高频(六)linux内核 1.内核态,用户态的区别⭐⭐⭐ 内核态和用户态的区别主要在于权限和安全性。 权限:内核态拥有最高的权限,可以访问和执行所有的系统指令和资源,而用户态的权限相对较低&#x…...
位置编码汇总 # 持续更新
看了那么多还没有讲特别好的,GPT老师讲的不错关于三角函数编码。 一、 手撕transformer常用三角位置编码 GPT说:“低维度的编码(例如,第一个维度)可以捕捉到大的位置差异,而高维度的编码则可以捕捉到小的细…...
电阻(Resistor)详解
一、电阻的定义与核心作用 电阻是电子电路中用于 限制电流、分压、调节信号电平、消耗功率 的基础被动元件,其阻值(Resistance)单位为欧姆(Ω)。其核心作用可归纳为: 限流保护:防止元器件过电流…...
DaVinci Resolve19.1下载:达芬奇调色中文版+安装步骤
如大家所了解的,DaVinci Resolve中文名为达芬奇,是一款专业视频编辑与调色软件。它最初以调色功能闻名,但经过多年发展,已扩展为一套完整的后期制作解决方案,涵盖了剪辑、视觉特效、动态图形和音频后期制作等多个模块。…...
文件IO 2
补充一些用到前面没提到的方法 isDirectory()方法,检查一个对象是否是文件夹,是true不是false isFile()方法,检测一个对象是否为文件,是true不是false 文件的读写操作实践 上一篇大致讲了文件读写操作的基本操作,下面是实践时…...
【Word】批注一键导出:VBA 宏
📌 VBA 宏代码实现 下面是完整的 VBA 代码,支持: 自动创建新文档,并将当前 Word 文档的所有批注导出。批注格式清晰,包括编号、作者、日期和批注内容。智能检测,如果当前文档没有批注,则提示用…...
《深度洞察:MySQL与Oracle中游标的性能分野》
在数据库管理的复杂领域中,游标作为一种强大的工具,用于对数据进行逐行处理,为许多复杂的数据操作提供了解决方案。然而,当涉及到MySQL和Oracle这两大主流数据库时,游标在性能表现上存在着显著的差异。深入理解这些差异…...
LINUX 1
快照 克隆:关机状态下:长时间备份 uname 操作系统 -a 获取所有信息 绝对路径 相对路径 -a -l 列表形式查看 -h 查看版本 相对路径这个还没太搞懂 LS -L LL 简写 显示当前路径 pwd cd 切换到目录 clear 清屏 reboot 重启操作系统...
高效定位 Go 应用问题:Go 可观测性功能深度解析
作者:古琦 背景 自 2024 年 6 月 26 日,阿里云 ARMS 团队正式推出面向 Go 应用的可观测性监控功能以来,我们与程序语言及编译器团队携手并进,持续深耕技术优化与功能拓展。这一创新性的解决方案旨在为开发者提供更为全面、深入且…...
