摘要:本文分享MySQL数据库学习的核心思维、SQL编写技巧及性能调优实战经验,包含索引设计、查询优化等实用案例,助你避开开发陷阱。
一、学习路径:建立数据库编程思维
核心理念:
“先设计,后编码”
写SQL前先厘清三要素:
数据关系(ER图)
业务场景(读写比例/数据量)
访问路径(查询链路)
案例:设计电商订单系统时,先绘制ER图明确关联关系(用户-订单-商品),避免后期复杂JOIN查询混乱:

二、SQL编写技巧:优雅与效率并存
▶ 技巧1:用WITH优化复杂查询(MySQL 8.0+)
问题场景:多层嵌套子查询导致可读性差
优化方案:
-- 原始嵌套查询(混乱) SELECT * FROM ( SELECT user_id, SUM(amount) FROM orders WHERE status='paid' GROUP BY user_id ) t WHERE t.sum > 1000; -- 使用CTE优化(清晰) WITH paid_orders AS ( SELECT user_id, SUM(amount) total FROM orders WHERE status='paid' GROUP BY user_id ) SELECT * FROM paid_orders WHERE total > 1000;
▶ 技巧2:巧用窗口函数替代循环
统计需求:计算用户订单金额排名
-- 传统方法需多次查询 -- 窗口函数一行解决 SELECT user_id, order_amount, RANK() OVER (ORDER BY order_amount DESC) AS rank_top FROM orders;
https://img-blog.csdnimg.cn/20210715215753987.png
(图示:RANK()函数实现分组排名)
三、性能优化核心:索引的正确打开方式
▶ 黄金法则:
-
最左前缀原则:
-- 创建复合索引 (status, create_time) CREATE INDEX idx_order_status_time ON orders(status, create_time); -- 有效查询(命中索引) SELECT * FROM orders WHERE status='paid' AND create_time > '2023-01-01'; -- 失效查询(跳过status) SELECT * FROM orders WHERE create_time > '2023-01-01';
-
避免索引失效的雷区:
-
❌ 在索引列上使用函数:
WHERE YEAR(create_time)=2023 -
❌ 类型转换:
WHERE user_id = '1001'(实际为INT类型) -
❌ LIKE模糊查询:
WHERE name LIKE '%abc'(前导通配符)
-
▶ 执行计划分析实战:
EXPLAIN SELECT p.name, COUNT(o.id) FROM products p JOIN order_items oi ON p.id = oi.product_id JOIN orders o ON oi.order_id = o.id WHERE o.status = 'completed' GROUP BY p.id;
https://img-blog.csdnimg.cn/20201203173458508.png
关键指标解读:
-
type:
ALL(全表扫描)→ 需优化 -
key:
NULL(未用索引)→ 添加status索引 -
rows:扫描行数越少越好
四、避坑指南:真实项目经验总结
-
连接池配置:
# 推荐配置(避免连接风暴) spring.datasource.hikari.maximum-pool-size=20 spring.datasource.hikari.connection-timeout=3000
-
批量操作提升10倍性能:
// 错误:逐条插入 for(Order order : list) { jdbcTemplate.update("INSERT INTO orders(...) VALUES (...)"); } // 正确:批量提交 jdbcTemplate.batchUpdate("INSERT ...", new BatchPreparedStatementSetter() { ... }); -
冷热数据分离:
-
热数据(最近3月订单)→ SSD存储
-
冷数据(历史订单)→ 归档至ClickHouse
-
五、学习资源推荐
-
图解工具:
-
在线ER建模:dbdiagram.io
-
执行计划分析:explain.dalibo.com
-
-
经典书籍:
-
《高性能MySQL》
-
《MySQL技术内幕:InnoDB存储引擎》
-
结语
“优秀的数据库设计是系统高效运行的基石”
通过本文的思维方法+实战技巧,笔者在项目中成功将查询耗时从2.3s降至0.08s。建议多使用EXPLAIN分析执行计划,善用可视化工具辅助设计。欢迎在评论区交流优化案例!

4670

被折叠的 条评论
为什么被折叠?



