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

简介: 教程来源 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/

相关文章
|
3天前
|
存储 安全 Java
首个 Java Harness Framework 来了丨AgentScope 把 OpenClaw 带到企业分布式场景
本文旨在正式宣告 AgentScope Java 1.1.0 里程碑版本的发布,重点阐述该版本如何从工程实践层面完整落地“Harness Framework”理念。
675 13
|
3月前
|
人工智能 自然语言处理 Java
大模型应用开发5-SpringAIalibaba实战
本文介绍了SpringAIAlibaba开源项目,该项目基于SpringAI构建,为阿里云通义系列模型提供Java开发实践。主要内容包括: 基础使用:配置模型API、依赖引入、调用示例,支持同步和流式调用; 多种集成方式:对接本地Ollama模型、ChatClient高级API、SSE流式输出; 核心功能实现:提示词模板、结构化输出、持久化内存、文本生成图片/语音; 高级能力:向量数据库、RAG增强检索、工具调用(Tool Calling); MCP协议:标准化工具调用方案,实现服务端工具共享;
|
9月前
|
人工智能 安全 中间件
阿里云 AI 中间件重磅发布,打通 AI 应用落地“最后一公里”
9 月 26 日,2025 云栖大会 AI 中间件:AI 时代的中间件技术演进与创新实践论坛上,阿里云智能集团资深技术专家林清山发表主题演讲《未来已来:下一代 AI 中间件重磅发布,解锁 AI 应用架构新范式》,重磅发布阿里云 AI 中间件,提供面向分布式多 Agent 架构的基座,包括:AgentScope-Java(兼容 Spring AI Alibaba 生态),AI MQ(基于Apache RocketMQ 的 AI 能力升级),AI 网关 Higress,AI 注册与配置中心 Nacos,以及覆盖模型与算力的 AI 可观测体系。
1650 88
|
3天前
|
人工智能 安全 测试技术
基于Harness + Langgraph + A2A 写一个 Agent Team,实现一支硅基团队自己 写代码
基于Harness + Langgraph + A2A 写一个 Agent Team,实现一支硅基团队自己 写代码
基于Harness + Langgraph + A2A 写一个 Agent Team,实现一支硅基团队自己 写代码
|
28天前
|
前端开发 JavaScript 程序员
初级程序员必备的十大技能之开发工具熟练使用(三)
教程来源 https://bncne.cn/ 浏览器开发者工具是前端调试核心利器,涵盖Elements(实时编辑DOM/CSS)、Console(日志、断点、DOM操作)、Sources(多类型断点与作用域调试)、Network(请求分析与模拟)、Performance(性能指标与火焰图)及Application(存储管理)六大面板,全面提升开发效率。
|
28天前
|
程序员 Shell 持续交付
初级程序员必备的十大技能之开发工具熟练使用(二)
教程来源 https://zlpow.cn/ 命令行是程序员高效开发的“第二语言”:涵盖文件操作、进程管理、网络诊断、管道重定向、Shell脚本及终端增强工具,助你快速定位问题、批量处理任务、自动化部署,全面提升系统操控力与生产力。
|
8月前
|
人工智能 IDE Java
AI Coding实践:CodeFuse + prompt 从系分到代码
在蚂蚁国际信贷业务系统建设过程中,技术团队始终面临双重考验:一方面需应对日益加速的需求迭代周期,满足严苛的代码质量规范与金融安全合规要求;另一方面,跨地域研发团队的协同效率与代码标准统一性,在传统开发模式下逐渐显现瓶颈。为突破效率制约、提升交付质量,我们积极探索人工智能辅助代码生成技术(AI Coding)的应用实践。本文基于蚂蚁国际信贷技术团队近期的实际项目经验,梳理AI辅助开发在金融级系统快速迭代场景中的实施要点并分享阶段性实践心得。
1935 25
AI Coding实践:CodeFuse + prompt 从系分到代码
|
3天前
|
人工智能 Cloud Native 架构师
混合云时代的团队质效破局:适合团队协作开发使用的 AI 编程助手软件云原生落地指南
2026年,多功能、任务驱动型的“协作智能体”成为大型开发团队的标配。在搜寻“适合团队协作开发使用的AI编程助手软件”时,团队更关注工具在跨库联调、多任务并行环境隔离以及代码幻觉控制上的表现。麦肯锡数据显示,88% 的中大型研发团队引入 AI 协作时,首要考量其在复杂多人流水线中的白盒化审计与并发控制能力。
122 0
|
3天前
|
存储 SQL 程序员
程序员必备的十大技能(进阶版)之高性能数据库实战(一)
教程来源 http://zlpow.cn/ 本文聚焦高性能数据库实战,涵盖B+树索引原理与优化、SQL调优、分库分表、读写分离、连接池及事务锁机制等八大核心维度,助开发者突破千万级数据性能瓶颈。
|
3天前
|
API 定位技术 开发工具
金融行业的IP风控反欺诈服务怎么选?3个合规指标+离线库方案
本文剖析金融IP风控三大合规痛点:数据不出境、业务零中断、决策全审计,提出私有化部署、高可用架构、全量审计三大选型指标,并详解离线库落地实践,助力金融机构构建真正合规、可靠、可溯的反欺诈体系。(239字)

热门文章

最新文章