MySQL优化

MySQL 优化不是一个点,而是从 SQL → 索引 → 表结构 → 架构 → 系统层一整套体系。你如果能按这个思路回答,基本就是中高级水平了。

我帮你整理一套**面试 + 实战通用的优化方案(从低到高)**👇


🎯 一、先给你一个"王炸总结"(面试直接说)

MySQL 优化一般从 SQL 语句、索引设计、表结构、执行计划、缓存机制以及架构层(读写分离、分库分表)几个方面入手,核心目标是减少扫描数据量、避免回表、提高查询效率。


🚀 二、SQL 层优化(最直接见效)

1️⃣ 避免全表扫描

❌ 错误:

复制代码
SELECT * FROM user WHERE name = '张三';

👉 如果 name 没索引 → 全表扫


2️⃣ 不要 SELECT *

👉 原因:

  • 多读无用字段

  • 影响索引覆盖

✅ 正确:

复制代码
SELECT id, name FROM user;

3️⃣ 避免函数操作索引列

❌:

复制代码
SELECT * FROM user WHERE DATE(create_time) = '2025-01-01';

👉 索引失效

✅:

复制代码
WHERE create_time >= '2025-01-01 00:00:00'
AND create_time < '2025-01-02 00:00:00'

4️⃣ 避免隐式类型转换

❌:

复制代码
WHERE id = '123'

👉 可能导致索引失效


5️⃣ 用 LIMIT 限制数据

复制代码
SELECT * FROM order LIMIT 10;

🧠 三、索引优化(核心中的核心)

1️⃣ 建立合适索引

复制代码
CREATE INDEX idx_name ON user(name);

2️⃣ 最左前缀原则 ⭐

复制代码
INDEX(a, b, c)

支持:

  • a ✅

  • a,b ✅

  • a,b,c ✅

  • b ❌


3️⃣ 覆盖索引(非常重要)

复制代码
SELECT name FROM user WHERE name = '张三';

👉 如果索引里有 name:

  • 不用回表

  • 性能极高


4️⃣ 避免索引失效场景

常见失效:

  • LIKE '%xxx'

  • OR(部分情况)

  • !=

  • IS NULL(某些版本)


5️⃣ 索引不是越多越好

👉 缺点:

  • 写入慢

  • 占空间


📊 四、执行计划分析(EXPLAIN 必会)

复制代码
EXPLAIN SELECT ...

重点看:

字段 含义
type ALL(最差)→ index → range → ref → const
key 用了哪个索引
rows 扫描行数
extra 是否 using index / filesort

🏗 五、表结构优化

1️⃣ 字段类型要小

复制代码
int → bigint(没必要就别用)

2️⃣ 避免 NULL

👉 NULL 会增加判断成本


3️⃣ 反范式(适当冗余)

👉 用空间换时间:

复制代码
订单表加用户名

4️⃣ 拆大表

👉 超大表:

  • 分表

  • 历史数据归档


⚡ 六、常见性能杀手(面试喜欢问)

❌ 深分页

复制代码
LIMIT 100000, 10

👉 会扫描 10万行

✅ 优化:

复制代码
WHERE id > 上次最大ID
LIMIT 10

❌ 排序(filesort)

👉 没走索引排序


❌ 临时表(Using temporary)

👉 group by / order by


🧩 七、架构层优化(中高级)

1️⃣ 读写分离

  • 主库:写

  • 从库:读


2️⃣ 分库分表

👉 数据量大时:

  • 水平分表(按 user_id)

  • 垂直拆分(字段拆)


3️⃣ 缓存(非常重要)

👉 常用:

  • Redis

👉 思路:

  • 热数据缓存

  • 减少数据库压力


4️⃣ 慢查询优化

复制代码
SHOW VARIABLES LIKE 'slow_query_log';

🧠 八、优化思路(真正高手的逻辑)

👉 一定要记住这句话:

MySQL 优化的本质是:减少数据扫描量 + 减少 IO + 利用索引


🔥 九、终极总结(面试王炸)

你可以这样说👇:

MySQL 优化我一般分为几个层次:

第一是 SQL 层避免全表扫描;

第二是通过合理设计索引提高查询效率;

第三是通过 EXPLAIN 分析执行计划;

第四是优化表结构减少数据冗余和 IO;

最后在数据量大时通过缓存、读写分离和分库分表来提升整体性能。

相关推荐
2401_89491553几秒前
Geo 优化源码部署实战:环境配置、参数调优完整指南
运维·服务器·数据库·tcp/ip·安全
FfHUCisI17 分钟前
Golang database/sql 标准库基础
数据库·sql·golang
zhanghaha131436 分钟前
Python进阶教程:13_math 模块 —— 新手完全指南
数据库·python·机器学习
__zRainy__42 分钟前
Node系列 · 数据库:单表查询
数据库·后端·mysql·node.js
xcLeigh1 小时前
聊聊数据库迁移工具怎么从单机走向“云+端+服务”,KDMS架构拆解
数据库·架构·数据库迁移·kes·kdms·架构拆解
St_rive1 小时前
selenium cookie的处理
数据库·selenium·测试工具
辻弋2012 小时前
一键优化电源计划、游戏模式、独显强制、禁用后台录制——DeltaForceBooster专治三角洲行动卡顿掉帧,所有改动可一键还原
服务器·数据库·windows·游戏·电脑·php
Wang's Blog2 小时前
PostgreSQL笔记51: 基于 pgvector 构建企业级智能问答系统
数据库·笔记·postgresql
我星期八休息3 小时前
Linux—五种IO模型与非阻塞IO
linux·运维·服务器·网络·数据库·网络协议
SQL-First布道者3 小时前
全面解构传统持久层框架,拥抱真正的 SQL-First
java·数据库·spring boot·sql·spring·mybatis·spring jdbc