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_887724502 分钟前
SQL注入的安全架构设计_将数据库置于内网隔离区
jvm·数据库·python
m0_678485453 分钟前
如何配置文件描述符限制_limits.conf中Oracle用户配置
jvm·数据库·python
我科绝伦(Huanhuan Zhou)4 分钟前
Oracle BBED 工具部署全流程:Linux 64位环境实操指南
linux·数据库·oracle
2401_835956815 分钟前
HTML5中Canvas局部刷新区域重绘的算法优化
jvm·数据库·python
MaCa .BaKa5 分钟前
52-考研备考服务平台系统-考研系统
java·spring boot·mysql·考研·tomcat·maven·mybatis
marsh02066 分钟前
34 openclaw事件溯源:实现可追溯的业务流程
数据库·ai·编程·技术
coderlin_6 分钟前
LangGraph项目二 同步数据仓库信息到元数据库并且建立向量索引
数据库·数据仓库
weixin_408717778 分钟前
如何导入带系统变量修改的SQL_确保SUPER权限并规避只读变量报错
jvm·数据库·python
m0_678485459 分钟前
c++怎么编写多线程安全的跨平台文件日志库_无锁队列与异步IO【附源码】
jvm·数据库·python
m0_746752309 分钟前
PHP源码运行时风扇狂转怎么办_硬件温控调优方法【说明】
jvm·数据库·python