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;

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

相关推荐
iAm_Ike3 小时前
Go 中自定义类型与基础类型间的显式类型转换详解
jvm·数据库·python
iuvtsrt3 小时前
Golang怎么实现方法集与接口的匹配_Golang如何理解值类型和指针类型实现接口的区别【详解】
jvm·数据库·python
tongluowan0075 小时前
MySQL中列数量及长度
数据库·mysql
-liming-5 小时前
单片机设计_串口调试工具
数据库·单片机·mongodb
鹿角片ljp5 小时前
从告警检测到智能研判:SQL 注入研判模型的设计与实践
数据库·sql
小新同学^O^6 小时前
简单学习 --> Spring事务
数据库·学习·spring
前进的李工6 小时前
MySQL慢查询日志优化实战
数据库·mysql·性能优化
KaMeidebaby7 小时前
卡梅德生物技术快报|禽类成纤维细胞 FISH 实验:鸟类性别染色体基因定位技术实现与数据验证
前端·数据库·其他·百度·新浪微博
ECT-OS-JiuHuaShan7 小时前
彻底定理化:从量子纠缠到量子代谢
数据库·人工智能·学习·算法·生活·量子计算