初级程序员必备的十大技能之数据库基础(三)

简介: 教程来源 http://ltglu.cn/ 本文详解数据库索引优化与事务机制:索引类比书目录,B+树大幅降低IO;详解最左前缀、函数/类型转换等索引失效场景及EXPLAIN分析法;事务部分涵盖ACID、四大隔离级别(解决脏读/不可重复读/幻读)、行锁/乐观锁及秒杀防超卖实战。

四、索引优化:查询加速的核心

4.1 索引的本质
索引就像书的目录,让你不需要翻遍整本书就能找到目标。

没有索引:全表扫描,查询 100 万行需要扫描 100 万次
有索引:B+ 树查找,100 万行只需要约 20 次 IO 操作

4.2 B+ 树索引原理

B+ 树结构:
                 [50]
                /    \
            [30]      [70]
           /   \      /   \
        [20]  [40]  [60]  [80]
         ↓     ↓     ↓     ↓
       数据   数据   数据   数据
       (叶子节点之间用链表连接,方便范围查询)

4.3 索引的最佳实践
哪些列应该建索引?
image.png
复合索引的最左前缀原则

-- 创建复合索引
CREATE INDEX idx_name_age ON users(name, age);

-- ✅ 能使用索引的查询
WHERE name = '张三'              -- 使用索引第1列
WHERE name = '张三' AND age = 25 -- 使用全部索引
WHERE name LIKE '张%'            -- 范围查找,可使用第1列

-- ❌ 不能使用索引的查询
WHERE age = 25                   -- 跳过第1列
WHERE name = '张三' OR age = 25  -- OR 导致索引失效(部分情况)

索引失效的常见场景

-- 1. 对列使用函数
SELECT * FROM users WHERE YEAR(created_at) = 2024;  -- ❌
SELECT * FROM users WHERE created_at >= '2024-01-01' AND created_at < '2025-01-01'; -- ✅

-- 2. 隐式类型转换
SELECT * FROM users WHERE phone = 13800138000;  -- ❌ phone 是 VARCHAR,类型不匹配
SELECT * FROM users WHERE phone = '13800138000'; -- ✅

-- 3. 前导模糊匹配
SELECT * FROM users WHERE name LIKE '%三';    -- ❌
SELECT * FROM users WHERE name LIKE '张%';    -- ✅

-- 4. OR 条件
SELECT * FROM users WHERE name = '张三' OR age = 25;  -- ⚠️ 可能失效

-- 5. NOT 条件
SELECT * FROM users WHERE name NOT IN ('张三', '李四'); -- ⚠️ 效率低

4.4 执行计划分析
使用 EXPLAIN 分析查询语句,是优化 SQL 的必备技能。

EXPLAIN SELECT * FROM users WHERE name = '张三';

-- 输出关键字段解读:
-- type: 访问类型(性能从好到差)
--   system > const > eq_ref > ref > range > index > ALL
--   ALL 表示全表扫描,需要优化!
-- possible_keys: 可能使用的索引
-- key: 实际使用的索引
-- rows: 预估扫描的行数
-- Extra: 额外信息(Using filesort 表示需要额外排序,需要优化)
-- 实际优化案例
-- 慢查询
EXPLAIN SELECT * FROM orders WHERE YEAR(order_date) = 2024;
-- type: ALL, rows: 1000000 (全表扫描)

-- 优化后
ALTER TABLE orders ADD INDEX idx_order_date (order_date);
EXPLAIN SELECT * FROM orders WHERE order_date >= '2024-01-01' AND order_date < '2025-01-01';
-- type: range, rows: 36500 (扫描1年的数据,约3.6万行)

五、事务:要么全做,要么全不做

事务是保证数据一致性的重要机制,尤其在金融、电商等场景。

5.1 什么是事务?
事务是一组 SQL 操作,要么全部成功,要么全部失败。

经典案例:银行转账

-- 张三给李四转账100元
START TRANSACTION;

UPDATE accounts SET balance = balance - 100 WHERE user = '张三';
UPDATE accounts SET balance = balance + 100 WHERE user = '李四';

-- 如果中间出现断电或错误,可以回滚
ROLLBACK;

-- 全部成功后才提交
COMMIT;

5.2 ACID 特性
image.png
5.3 事务的隔离级别
事务隔离级别解决并发事务的问题,但隔离级别越高,性能越差。

-- 查看当前隔离级别
SELECT @@transaction_isolation;

-- 设置隔离级别
SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED;

image.png
三种问题解释:

-- 1. 脏读:读到未提交的数据
-- 事务A:UPDATE balance SET amount = amount - 100 WHERE id=1;  -- 未提交
-- 事务B:SELECT amount FROM balance WHERE id=1;  -- 读到-100(脏数据)
-- 事务A:ROLLBACK;  -- 事务B读到了不存在的数

-- 2. 不可重复读:同一事务内,同一条记录两次读取结果不同
-- 事务A:SELECT amount FROM balance WHERE id=1;  -- 100
-- 事务B:UPDATE balance SET amount = 200 WHERE id=1; COMMIT;
-- 事务A:SELECT amount FROM balance WHERE id=1;  -- 200(前后不一致)

-- 3. 幻读:同一事务内,两次查询返回的记录数不同
-- 事务A:SELECT COUNT(*) FROM users WHERE age > 18;  -- 10条
-- 事务B:INSERT INTO users(name,age) VALUES('新用户',20); COMMIT;
-- 事务A:SELECT COUNT(*) FROM users WHERE age > 18;  -- 11条(多了1条)

5.4 锁机制

-- 1. 行级锁(InnoDB 默认)
-- 只锁住需要修改的行,并发性能好
SELECT * FROM users WHERE id = 1 FOR UPDATE;  -- 锁定id=1的行

-- 2. 表级锁(MyISAM 默认)
-- 锁住整张表,并发性能差
LOCK TABLES users WRITE;  -- 写锁
LOCK TABLES users READ;   -- 读锁

-- 3. 乐观锁(通过版本号实现)
-- 适用于读多写少的场景
UPDATE products 
SET stock = stock - 1, version = version + 1 
WHERE id = 1 AND version = 5;  -- 只有版本号匹配才更新

5.5 事务实战

-- 电商秒杀场景:防止超卖
START TRANSACTION;

-- 1. 查询库存(使用行锁)
SELECT stock FROM products WHERE id = 1 FOR UPDATE;

-- 2. 检查库存
IF stock > 0 THEN
    -- 3. 更新库存
    UPDATE products SET stock = stock - 1 WHERE id = 1;

    -- 4. 创建订单
    INSERT INTO orders (product_id, user_id, quantity) VALUES (1, 100, 1);

    COMMIT;
ELSE
    ROLLBACK;
END IF;

来源:
http://xbivx.cn/

相关文章
|
16天前
|
人工智能 JSON 供应链
畅用7个月无影 JVS Claw |手把手教你把JVS改造成「科研与产业地理情报可视化大师」
LucianaiB分享零成本畅用JVS Claw教程(学生认证享7个月使用权),并开源GeoMind项目——将JVS改造为科研与产业地理情报可视化AI助手,支持飞书文档解析、地理编码与腾讯地图可视化,助力产业关系图谱构建。
23521 12
畅用7个月无影 JVS Claw |手把手教你把JVS改造成「科研与产业地理情报可视化大师」
|
4天前
|
Shell API 开发工具
Claude Code 快速上手指南(新手友好版)
AI编程工具卷疯啦!Claude Code凭借任务驱动+终端原生的特性,成了开发者的效率搭子。本文从安装、登录、切换国产模型到常用命令,手把手带新手快速上手,全程避坑,30分钟独立用起来。
1303 7
|
5天前
|
人工智能 BI 持续交付
Claude Code 深度适配 DeepSeek V4-Pro 实测:全场景通关与真实体验报告
在 AI 编程工具日趋主流的今天,Claude Code 凭借强大的任务执行、工具调用与工程化能力,成为开发者与自动化运维的核心效率工具。但随着原生模型账号稳定性问题频发,寻找一套兼容、稳定、能力在线的替代方案变得尤为重要。DeepSeek V4-Pro 作为新一代高性能大模型,提供了完整兼容 Claude 协议的 API 接口,只需简单配置即可无缝驱动 Claude Code,且在任务执行、工具调用、复杂流程处理上表现极为稳定。
1405 3
|
10天前
|
人工智能 缓存 Shell
Claude Code 全攻略:命令大全 + 实战工作流(完整版)
Claude Code 是一款运行在终端环境下的 AI 编码助手,能够直接在项目目录中理解代码结构、编辑文件、执行命令、执行开发计划,并支持持久化记忆、上下文压缩、后台任务、多模型切换等专业能力。对于日常开发、项目维护、快速重构、代码审查等场景,它可以大幅减少手动操作、提升编码效率。本文从常用命令、界面模式、核心指令、记忆机制、图片处理、进阶工作流等维度完整说明,帮助开发者快速上手并稳定使用。
2556 4
|
1天前
|
人工智能 开发工具 iOS开发
Claude Code 新手完全上手指南:安装、国产模型配置与常用命令全解
Claude Code 是一款运行在终端环境中的 AI 编程助手,能够直接在命令行中完成代码生成、项目分析、文件修改、命令执行、Git 管理等开发全流程工作。它最大的特点是**任务驱动、终端原生、轻量高效、多模型兼容**,无需图形界面、不依赖 IDE 插件,能够深度融入开发者日常工作流。
688 1
|
3天前
|
人工智能 JSON BI
DeepSeek V4-Pro 接入 Claude Code 完全实战:体验、测试与关键避坑指南
Claude Code 作为当前主流的 AI 编程辅助工具,凭借强大的代码理解、工程执行与自动化能力深受开发者喜爱,但原生模型的使用成本相对较高。为了在保持能力的同时进一步降低开销,不少开发者开始寻找兼容度高、价格更友好的替代模型。DeepSeek V4 系列的发布带来了新的选择,该系列包含 V4-Pro 与 V4-Flash 两款模型,并提供了与 Anthropic 完全兼容的 API 接口,理论上只需简单修改配置,即可让 Claude Code 无缝切换为 DeepSeek 引擎。
975 0
|
20天前
|
人工智能 缓存 BI
Claude Code + DeepSeek V4-Pro 真实评测:除了贵,没别的毛病
JeecgBoot AI专题研究 把 Claude Code 接入 DeepSeek V4Pro,跑完 Skills —— OA 审批、大屏、报表、部署 5 大实战场景后的真实体验 ![](https://oscimg.oschina.net/oscnet/up608d34aeb6bafc47f
6082 22
Claude Code + DeepSeek V4-Pro 真实评测:除了贵,没别的毛病
|
3天前
|
人工智能 Linux API
hermes agent 安装教程:安装优化 + 模型配置 + 工具启用指南
Hermes Agent 是 Nous Research 于 2026 年发布的开源自主进化 AI 智能体框架(MIT 协议,Python 编写)。它通过任务沉淀技能、持久化记忆、原生多工具集成与并行子智能体,实现“越用越强”。支持 Linux/macOS/WSL2,安装便捷,面向个人与企业的新一代私有化 AI 助手。