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

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

相关文章
|
22天前
|
移动开发 JavaScript 前端开发
前端组件库——Wot Design Uni知识点大全(一)
教程来源 https://zlpow.cn Wot Design Uni 是基于 Vue3 + TypeScript 的开源 uni-app UI 组件库,提供 70+ 高质量移动端组件,支持微信/支付宝小程序、H5、App 等多端兼容,内置暗黑模式、国际化(15+语言)与 CSS 变量主题定制,大幅提升跨平台开发效率。
|
17天前
|
人工智能 自然语言处理 安全
【新人快速上手使用】小白也能上手的 OpenClaw 2.6.6 安装教程(技术分享)
OpenClaw(小龙虾)是2026年热门开源「数字员工」,支持Windows一键部署(5分钟搞定),本地运行、零代码、全自动办公。无需配置环境,可整理文件、发邮件、浏览器自动化等,隐私安全,小白友好。
|
1月前
|
监控 负载均衡 Dubbo
SpringBoot整合Dubbo,构建高性能分布式系统
Dubbo是阿里巴巴开源的一款高性能、轻量级的 Java RPC 框架,主要功能包括:面向接口的远程方法调用、智能负载均衡、服务自动注册与发现、高可用性、运行期流量调度、可视化的服务治理。
215 13
|
1月前
|
应用服务中间件
2026阿里云轻量服务器抄底价:2核2G配置秒杀38元/年!4核8G费用1159元起(不限流量)
2026阿里云轻量服务器官方页面:https://t.aliyun.com/U/PEdlFP 轻量新价出炉:2核2G低至38元/年(新用户秒杀),2核4G 199元/年,4核8G 1159元/年起;全系200M带宽+不限流量,性价比远超友商。新用户专享,抢购需趁早!
385 15
|
1月前
|
人工智能 机器人 API
零基础阿里云计算巢搭建OpenClaw保姆级教程|企业微信智能对接+大模型千问Qwen3.6-Plus API完整实操手册
2026年,开源AI智能体框架OpenClaw(曾用名Clawdbot,被称为“龙虾AI”)凭借轻量化、强执行、多平台接入的特性,成为个人与团队搭建专属AI助手的首选方案。它打破传统AI“只说不做”的局限,实现“理解指令→规划任务→自动执行→结果反馈”的全闭环,覆盖自动化办公、跨平台协作、消息处理等场景。阿里云计算巢作为官方一站式软件云化平台,将复杂部署流程简化为“表单填写+一键执行”,全程可视化、零代码操作,完美适配OpenClaw 7×24小时稳定运行需求;集成企业微信后,可实现办公场景单聊/群聊AI交互,无缝融入日常协作;搭配阿里云千问Qwen3.6-Plus大模型,解锁超长上下文、深度
211 3
|
22天前
|
移动开发 自然语言处理 小程序
前端组件库——Wot Design Uni知识点大全(三)
教程来源 https://rvtst.cn Wot Design Uni 是基于 Vue3 的跨平台 UI 组件库,支持微信/支付宝小程序、H5、App 等多端兼容;提供样式隔离修复、virtualHost 渲染优化、虚拟列表、按需引入、国际化(15+语言)等完整解决方案。
|
17天前
|
弹性计算 安全 关系型数据库
阿里云特惠云服务器99元和199元1年新购续费同价:配置、适用场景与专属组合套餐解析
阿里云推出的99元1年和199元1年新购续费同价云服务器因价格实惠、性能适中,深受个人和普通企业用户的喜爱。99元经济型e实例适合个人开发者等搭建轻量级应用;199元通用算力型u1实例则能稳定支持中小型企业官网等场景。此外,阿里云还提供建站礼包、安全防护、弹性数据库、高效存储及多场景组合套餐等专属优惠,并构建了一个丰富、灵活、高性价比的云产品生态,助力用户无忧上云、轻松降本。
|
18天前
|
存储 人工智能 弹性计算
揭秘千问 APP 千万级 AI 订单背后的记忆存储实践
2026年春节,千问 APP “春节请客计划” 9 小时破 1000 万单,依赖 Tablestore 构建的一站式记忆系统:支持短期/长期记忆统一管理、毫秒级读写、Serverless 弹性伸缩、多模态数据融合及原生向量检索,实现数十亿条记忆的高效存储与实时流转。
220 6