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

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

相关文章
|
8天前
|
Shell API 开发工具
Claude Code 快速上手指南(新手友好版)
AI编程工具卷疯啦!Claude Code凭借任务驱动+终端原生的特性,成了开发者的效率搭子。本文从安装、登录、切换国产模型到常用命令,手把手带新手快速上手,全程避坑,30分钟独立用起来。
2763 15
|
6天前
|
人工智能 开发工具 iOS开发
Claude Code 新手完全上手指南:安装、国产模型配置与常用命令全解
Claude Code 是一款运行在终端环境中的 AI 编程助手,能够直接在命令行中完成代码生成、项目分析、文件修改、命令执行、Git 管理等开发全流程工作。它最大的特点是**任务驱动、终端原生、轻量高效、多模型兼容**,无需图形界面、不依赖 IDE 插件,能够深度融入开发者日常工作流。
2304 4
|
21天前
|
人工智能 JSON 供应链
畅用7个月无影 JVS Claw |手把手教你把JVS改造成「科研与产业地理情报可视化大师」
LucianaiB分享零成本畅用JVS Claw教程(学生认证享7个月使用权),并开源GeoMind项目——将JVS改造为科研与产业地理情报可视化AI助手,支持飞书文档解析、地理编码与腾讯地图可视化,助力产业关系图谱构建。
23554 13
畅用7个月无影 JVS Claw |手把手教你把JVS改造成「科研与产业地理情报可视化大师」
|
8天前
|
人工智能 JSON BI
DeepSeek V4-Pro 接入 Claude Code 完全实战:体验、测试与关键避坑指南
Claude Code 作为当前主流的 AI 编程辅助工具,凭借强大的代码理解、工程执行与自动化能力深受开发者喜爱,但原生模型的使用成本相对较高。为了在保持能力的同时进一步降低开销,不少开发者开始寻找兼容度高、价格更友好的替代模型。DeepSeek V4 系列的发布带来了新的选择,该系列包含 V4-Pro 与 V4-Flash 两款模型,并提供了与 Anthropic 完全兼容的 API 接口,理论上只需简单修改配置,即可让 Claude Code 无缝切换为 DeepSeek 引擎。
2055 1
|
2天前
|
人工智能 Linux BI
国内用 Claude Code 终于不用翻墙了:一行命令搞定,自动接 DeepSeek
JeecgBoot AI专题研究 一键脚本:Claude Code + JeecgBoot Skills + DeepSeek 全平台接入 一行命令装好 Claude Code + JeecgBoot Skills + DeepSeek 接入,无需翻墙使用 Claude Code,支持 Wind
1306 1
国内用 Claude Code 终于不用翻墙了:一行命令搞定,自动接 DeepSeek
|
14天前
|
人工智能 缓存 Shell
Claude Code 全攻略:命令大全 + 实战工作流(完整版)
Claude Code 是一款运行在终端环境下的 AI 编码助手,能够直接在项目目录中理解代码结构、编辑文件、执行命令、执行开发计划,并支持持久化记忆、上下文压缩、后台任务、多模型切换等专业能力。对于日常开发、项目维护、快速重构、代码审查等场景,它可以大幅减少手动操作、提升编码效率。本文从常用命令、界面模式、核心指令、记忆机制、图片处理、进阶工作流等维度完整说明,帮助开发者快速上手并稳定使用。
3457 5
|
7天前
|
人工智能 安全 开发工具
Claude Code 官方工作原理与使用指南
Claude Code 不是传统代码补全工具,而是 Anthropic 推出的终端 AI 代理,具备代理循环、双驱动架构(模型+工具)、全局项目感知、6 种权限模式等核心能力,本文基于官方文档系统解析其工作原理与高效使用技巧。
1095 0