程序员必备的十大技能(进阶版)之高性能数据库实战(二)

简介: 教程来源 http://bncne.cn/ 本节深入讲解SQL调优核心技巧:解析执行计划(EXPLAIN)、深分页优化、JOIN策略(驱动表选择/算法适配)、GROUP BY/ORDER BY索引优化,以及批量操作最佳实践,全面提升查询性能与系统稳定性。

二、SQL语句深度调优

2.1 执行计划全面解读

EXPLAIN FORMAT=JSON 
SELECT o.id, o.amount, u.name
FROM orders o
INNER JOIN users u ON o.user_id = u.id
WHERE o.create_time > '2024-01-01'
  AND o.amount > 100
ORDER BY o.id DESC
LIMIT 100;

执行计划各列含义
image.png
image.png
key_len计算示例

CREATE TABLE `test` (
    `id` int NOT NULL,
    `name` varchar(50) DEFAULT NULL,
    `age` int DEFAULT NULL,
    `score` decimal(10,2) DEFAULT NULL,
    INDEX idx_name_age (name, age)
);

-- key_len计算规则:
-- name: varchar(50) 变长 + 允许NULL → 50*3 + 1 + 2 = 153字节
-- age: int + 允许NULL → 4 + 1 = 5字节
-- 复合索引总key_len = 153 + 5 = 158

EXPLAIN SELECT * FROM test WHERE name = 'Alice' AND age = 25;
-- 输出 key_len = 158,表示用了索引的全部两列

EXPLAIN SELECT * FROM test WHERE name = 'Alice';
-- 输出 key_len = 153,表示只用了索引的第一列

2.2 深分页优化(百页后性能问题)

-- 问题SQL(offset越大越慢)
SELECT * FROM orders ORDER BY id LIMIT 1000000, 20;
-- 原理:需要扫描1000020行,丢弃前1000000行

-- 优化方案1:记住上一页的最大ID(游标分页)
SELECT * FROM orders 
WHERE id > 999999   -- 上一页的最大ID
ORDER BY id 
LIMIT 20;

-- 优化方案2:子查询优化
SELECT * FROM orders 
WHERE id >= (
    SELECT id FROM orders ORDER BY id LIMIT 1000000, 1
)
ORDER BY id 
LIMIT 20;

-- 优化方案3:延迟关联(适合需要查询多列的场景)
SELECT o.* 
FROM orders o
INNER JOIN (
    SELECT id FROM orders ORDER BY id LIMIT 1000000, 20
) AS tmp ON o.id = tmp.id;

2.3 JOIN优化策略
JOIN算法对比
image.png

-- 强制使用指定JOIN顺序
SELECT /*+ JOIN_ORDER(users, orders) */ *
FROM users
INNER JOIN orders ON users.id = orders.user_id
WHERE users.status = 1;

-- 优化小表驱动大表
-- 好的做法(users表小,orders表大)
SELECT * FROM users u 
INNER JOIN orders o ON u.id = o.user_id 
WHERE u.status = 1;
-- 原理:以users为驱动表,循环次数少

-- 避免的做法(如果users是大表)
SELECT * FROM orders o 
INNER JOIN users u ON o.user_id = u.id 
WHERE o.status = 1;

2.4 GROUP BY / DISTINCT / ORDER BY 优化

-- 问题查询:统计每个用户的订单总金额,按金额倒序
SELECT user_id, SUM(amount) as total
FROM orders
GROUP BY user_id
ORDER BY total DESC
LIMIT 10;

-- 分析:无法使用索引,需要临时表和文件排序

-- 优化方案1:创建覆盖索引 (user_id, amount)
CREATE INDEX idx_user_amount ON orders(user_id, amount);

-- 优化方案2:使用汇总表(空间换时间)
CREATE TABLE user_order_stats (
    user_id bigint PRIMARY KEY,
    order_count int DEFAULT 0,
    total_amount decimal(12,2) DEFAULT 0,
    last_order_time datetime
);

-- 通过触发器或定时任务更新汇总表
INSERT INTO user_order_stats (user_id, order_count, total_amount)
SELECT user_id, COUNT(*), SUM(amount)
FROM orders
GROUP BY user_id
ON DUPLICATE KEY UPDATE
    order_count = VALUES(order_count),
    total_amount = VALUES(total_amount);

2.5 批量操作优化

-- 错误做法:循环单条插入(1000条耗时约500ms)
for (Order order : orders) {
    jdbcTemplate.update("INSERT INTO orders (...) VALUES (?)", ...);
}

-- 正确做法:批量插入(1000条耗时约50ms)
INSERT INTO orders (user_id, order_no, amount, create_time) VALUES
(1, 'ORD001', 100.00, NOW()),
(2, 'ORD002', 200.00, NOW()),
...;
-- MySQL参数:max_allowed_packet=64M, bulk_insert_buffer_size=8M

-- 批量更新使用CASE WHEN
UPDATE orders SET status = CASE id
    WHEN 1 THEN 2
    WHEN 2 THEN 3
    WHEN 3 THEN 4
END
WHERE id IN (1,2,3);

来源:
http://yvyus.cn/

相关文章
|
1月前
|
API 定位技术 开发工具
金融行业的IP风控反欺诈服务怎么选?3个合规指标+离线库方案
本文剖析金融IP风控三大合规痛点:数据不出境、业务零中断、决策全审计,提出私有化部署、高可用架构、全量审计三大选型指标,并详解离线库落地实践,助力金融机构构建真正合规、可靠、可溯的反欺诈体系。(239字)
|
1月前
|
存储 安全 Java
首个 Java Harness Framework 来了丨AgentScope 把 OpenClaw 带到企业分布式场景
本文旨在正式宣告 AgentScope Java 1.1.0 里程碑版本的发布,重点阐述该版本如何从工程实践层面完整落地“Harness Framework”理念。
917 22
|
1月前
|
Java Windows
【主流版本】JDK安装版下载地址和环境配置方法
本页提供主流JDK版本(6u45至21)的百度网盘与夸克网盘下载链接,含提取码、文件大小等信息;并详细指导Windows系统下JAVA_HOME与PATH环境变量配置及验证方法,助力Java开发环境快速搭建。
|
2月前
|
前端开发 JavaScript 程序员
初级程序员必备的十大技能之开发工具熟练使用(三)
教程来源 https://bncne.cn/ 浏览器开发者工具是前端调试核心利器,涵盖Elements(实时编辑DOM/CSS)、Console(日志、断点、DOM操作)、Sources(多类型断点与作用域调试)、Network(请求分析与模拟)、Performance(性能指标与火焰图)及Application(存储管理)六大面板,全面提升开发效率。
|
1月前
|
SQL 监控 关系型数据库
软件开发进阶技能之数据库进阶(五)
教程来源 https://zlpow.cn/ 本节详解数据库高可用核心方案:主从复制(异步/半同步原理、搭建与延迟治理)、自动故障转移(MHA/Orchestrator)及读写分离实践,并涵盖监控指标、慢查询分析与配置调优,助力系统稳定扛住高并发。
|
2月前
|
前端开发 程序员 开发工具
初级程序员必备的十大技能之开发工具熟练使用(四)
教程来源 https://tmywi.cn/ VS Code深度集成Git:快捷键操作、冲突可视化解决;GitLens增强代码溯源与历史追踪;配合高效命令行别名与撤销技巧;辅以Node/前端多维调试方案,全面提升开发效能。
|
2月前
|
程序员 Shell 持续交付
初级程序员必备的十大技能之开发工具熟练使用(二)
教程来源 https://zlpow.cn/ 命令行是程序员高效开发的“第二语言”:涵盖文件操作、进程管理、网络诊断、管道重定向、Shell脚本及终端增强工具,助你快速定位问题、批量处理任务、自动化部署,全面提升系统操控力与生产力。
|
9月前
|
人工智能 运维 Kubernetes
Serverless 应用引擎 SAE:为传统应用托底,为 AI 创新加速
在容器技术持续演进与 AI 全面爆发的当下,企业既要稳健托管传统业务,又要高效落地 AI 创新,如何在复杂的基础设施与频繁的版本变化中保持敏捷、稳定与低成本,成了所有技术团队的共同挑战。阿里云 Serverless 应用引擎(SAE)正是为应对这一时代挑战而生的破局者,SAE 以“免运维、强稳定、极致降本”为核心,通过一站式的应用级托管能力,同时支撑传统应用与 AI 应用,让企业把更多精力投入到业务创新。
874 30
|
1月前
|
人工智能 Cloud Native 架构师
混合云时代的团队质效破局:适合团队协作开发使用的 AI 编程助手软件云原生落地指南
2026年,多功能、任务驱动型的“协作智能体”成为大型开发团队的标配。在搜寻“适合团队协作开发使用的AI编程助手软件”时,团队更关注工具在跨库联调、多任务并行环境隔离以及代码幻觉控制上的表现。麦肯锡数据显示,88% 的中大型研发团队引入 AI 协作时,首要考量其在复杂多人流水线中的白盒化审计与并发控制能力。
196 0
|
1月前
|
存储 SQL 程序员
程序员必备的十大技能(进阶版)之高性能数据库实战(一)
教程来源 http://zlpow.cn/ 本文聚焦高性能数据库实战,涵盖B+树索引原理与优化、SQL调优、分库分表、读写分离、连接池及事务锁机制等八大核心维度,助开发者突破千万级数据性能瓶颈。