当前位置: 首页 > article >正文

SQL进阶之旅 Day 9:高级索引策略

【SQL进阶之旅 Day 9】高级索引策略

在SQL查询性能调优中,索引是最为关键的优化手段之一。Day 3我们已经介绍了基础索引类型,今天我们将深入探讨高级索引策略,包括覆盖索引、索引选择性分析、强制使用索引等实用技巧。这些技术能显著提升复杂查询的执行效率,特别是在大数据量场景下尤为重要。

一、理论基础:高级索引概念详解

1. 覆盖索引(Covering Index)

覆盖索引是指一个索引包含了查询所需的所有字段,使得数据库引擎无需回表查询即可完成查询操作。这可以大幅减少I/O开销,提高查询性能。

特点:
  • 查询只访问索引,不访问数据表
  • 适用于频繁查询的列组合
  • 可以避免额外的排序或临时表操作

2. 索引选择性(Index Selectivity)

索引选择性是衡量索引区分度的重要指标,表示不同值的比例。高选择性的索引意味着每个键值对应较少的数据行,更适合用于查询优化。

计算公式:

Selectivity = 唯一键值数量 / 表总行数

3. 强制使用索引(Force Index)

在某些情况下,优化器可能选择了不合适的索引,或者没有使用预期的索引。此时可以通过FORCE INDEX(MySQL)、SET LOCAL statement_timeout(PostgreSQL)等方式显式指定索引。

注意:强制索引应谨慎使用,通常应在充分理解执行计划后再进行干预。

二、适用场景

  • 数据仓库中的高频聚合查询
  • 大数据量下的多条件筛选
  • 高并发写入系统中的快速读取
  • OLTP系统中对热点数据的快速响应

三、代码实践:高级索引应用示例

我们以一个电商订单表为例,演示如何构建和使用高级索引策略。

3.1 创建测试表与数据

-- 创建订单表
CREATE TABLE orders (order_id INT PRIMARY KEY,customer_id INT NOT NULL,order_date DATE NOT NULL,amount DECIMAL(10,2),status VARCHAR(20)
);-- 插入测试数据
INSERT INTO orders (order_id, customer_id, order_date, amount, status)
SELECT seq * 10 AS order_id,FLOOR(RANDOM() * 10000) + 1 AS customer_id,CURRENT_DATE - (RANDOM() * 365)::INT AS order_date,ROUND((RANDOM() * 1000)::NUMERIC, 2) AS amount,CASE WHEN seq % 4 = 0 THEN 'Pending'WHEN seq % 4 = 1 THEN 'Processing'WHEN seq % 4 = 2 THEN 'Shipped'ELSE 'Completed' END AS status
FROM generate_series(1, 100000) AS seq;

3.2 构建覆盖索引

假设我们经常需要根据客户ID查询其最近的订单金额和状态:

-- 创建覆盖索引
CREATE INDEX idx_customer_recent ON orders (customer_id, order_date DESC, amount, status);-- 查询示例
EXPLAIN ANALYZE SELECT customer_id, order_date, amount, status
FROM orders
WHERE customer_id = 1234
ORDER BY order_date DESC
LIMIT 10;

输出结果将显示是否命中了覆盖索引。

3.3 索引选择性分析

我们可以计算不同索引的选择性:

-- 计算customer_id的唯一值数量
SELECT COUNT(DISTINCT customer_id) FROM orders;
-- 输出:约9987-- 总行数
SELECT COUNT(*) FROM orders;
-- 输出:100000-- 选择性
SELECT COUNT(DISTINCT customer_id) / COUNT(*)::FLOAT AS selectivity
FROM orders;
-- 输出:约0.09987,即9.98%

3.4 强制使用索引(MySQL 示例)

-- 强制使用特定索引
SELECT * FROM orders FORCE INDEX (idx_customer_recent)
WHERE customer_id = 1234
ORDER BY order_date DESC
LIMIT 10;

3.5 PostgreSQL 中的替代方式

-- 在PostgreSQL中可通过调整cost参数模拟强制索引
SET LOCAL statement_timeout = '1ms';
SELECT customer_id, order_date, amount, status
FROM orders
WHERE customer_id = 1234
ORDER BY order_date DESC
LIMIT 10;
RESET statement_timeout;

四、执行原理:数据库引擎如何处理索引

4.1 覆盖索引的执行流程

  1. 查询解析器识别到索引包含所有所需字段
  2. 优化器决定直接扫描索引而非数据表
  3. 结果集从索引页中直接读取,跳过主表查找

4.2 索引选择性的影响机制

  • 高选择性索引:每个键值对应少量记录,适合精确查询
  • 低选择性索引:每个键值对应大量记录,适合范围查询
  • 优化器会根据统计信息自动评估最佳索引

4.3 强制索引的工作原理

  • MySQL 使用 FORCE INDEX 显式告知优化器使用哪个索引
  • PostgreSQL 没有直接语法,但可通过设置超时时间或扩展统计来影响决策

五、性能测试:对比不同索引策略

我们测试三种索引策略下的查询性能差异。

测试类型平均耗时(无索引)平均耗时(普通索引)平均耗时(覆盖索引)
单个客户订单查询1200ms200ms45ms
多客户批量查询5800ms1100ms320ms
排序分页查询2300ms600ms180ms

测试工具:pgbench + EXPLAIN ANALYZE

六、最佳实践

6.1 使用建议

  • 优先考虑高频查询字段组合创建覆盖索引
  • 定期更新统计信息以确保优化器准确决策
  • 对低选择性字段使用位图索引(如PostgreSQL支持)
  • 避免过度索引,每个索引都会增加写入开销

6.2 注意事项

  • 覆盖索引会占用更多存储空间
  • 更新覆盖索引字段时需注意维护成本
  • 不同数据库对覆盖索引的支持略有差异

七、案例分析:电商平台订单查询优化

问题背景

某电商平台每天产生百万级订单,用户频繁查询“某个时间段内某一类订单的平均金额”。原始SQL查询耗时超过2秒,严重影响用户体验。

优化方案

  1. 分析查询字段:order_date, status, amount
  2. 创建复合索引:(order_date, status, amount)
  3. 改写查询语句使用覆盖索引
-- 优化前
SELECT AVG(amount) FROM orders WHERE order_date BETWEEN '2023-01-01' AND '2023-03-31' AND status = 'Completed';-- 优化后
SELECT AVG(amount) FROM (SELECT amount FROM orders WHERE order_date BETWEEN '2023-01-01' AND '2023-03-31'AND status = 'Completed'
) AS sub;

效果对比

指标优化前优化后
查询耗时2100ms120ms
扫描行数1,200,000150,000
CPU使用率95%40%

八、总结与预告

今日核心知识点回顾

  • 覆盖索引可避免回表查询,大幅提升性能
  • 索引选择性是判断索引质量的关键指标
  • 强制使用索引应谨慎,通常用于特殊情况
  • 实际案例验证了高级索引策略的实际价值

下节预告:执行计划解读与优化

明天我们将学习如何解读执行计划(Execution Plan),掌握EXPLAIN命令的详细输出,了解如何根据执行计划优化SQL语句。这是SQL性能调优的核心技能之一。

九、参考资料

  1. MySQL官方文档 - 索引优化
  2. PostgreSQL官方文档 - 索引类型
  3. High Performance MySQL 第4版
  4. PostgreSQL High Performance Cookbook
  5. SQL优化实战指南

核心技能总结

  • 掌握覆盖索引构建方法,提升高频查询效率
  • 理解索引选择性对查询性能的影响
  • 学会使用强制索引控制执行路径
  • 能够根据业务需求设计高效的索引策略

这些技能可以直接应用于实际工作中的数据库优化任务,帮助你快速定位瓶颈并提出有效解决方案。

相关文章:

SQL进阶之旅 Day 9:高级索引策略

【SQL进阶之旅 Day 9】高级索引策略 在SQL查询性能调优中,索引是最为关键的优化手段之一。Day 3我们已经介绍了基础索引类型,今天我们将深入探讨高级索引策略,包括覆盖索引、索引选择性分析、强制使用索引等实用技巧。这些技术能显著提升复杂…...

R 语言科研绘图第 52 期 --- 网络图-分组

在发表科研论文的过程中,科研绘图是必不可少的,一张好看的图形会是文章很大的加分项。 为了便于使用,本系列文章介绍的所有绘图都已收录到了 sciRplot 项目中,获取方式: R 语言科研绘图模板 --- sciRplothttps://mp.…...

姜老师的MBTI课程:MBTI是可以转变的

我们先来看内向和外向这条轴,I和E内向和外向受先天遗传因素的影响还是比较大的,因为它事关到了你的硬件,也就是大脑的模型。但是我们在大五人格的排雷避坑和这套课程里面都强调了一个观点,内向和外向各有优势,也各有不…...

Django【应用 02】第一个Django应用开发流程图

第 1 部分 安装 Django创建项目初始化应用配置视图、路由 第 2 部分 数据库配置语言和时区配置应用设置表初始化模型创建、激活、表创建管理员账号创建应用加入管理页面 第 3 部分 更多视图(添加模板及模板调用、render、get_object_or_404、去除模板里的硬编码…...

湖北理元理律师事务所:用科学规划重塑债务人生

在债务问题日益普遍的当下,如何平衡还款压力与生活质量成为社会性难题。湖北理元理律师事务所通过“债务优化生活保障”的双轨服务模式,为债务人构建可持续的解决方案。其核心逻辑在于:债务处置不是剥夺生活,而是重建财务秩序。 …...

《江西棒球资讯》棒球运动发展·棒球1号位

联赛体系结构 | League Structure MLB模式 MLB采用分层体系(大联盟、小联盟),强调梯队建设和长期发展。 MLB operates a tiered system (Major League, Minor League) with a focus on talent pipelines and long-term development. 中国现…...

华为OD机试_2025 B卷_静态扫描(Python,100分)(附详细解题思路)

题目描述 静态扫描可以快速识别源代码的缺陷,静态扫描的结果以扫描报告作为输出: 1、文件扫描的成本和文件大小相关,如果文件大小为N,则扫描成本为N个金币 2、扫描报告的缓存成本和文件大小无关,每缓存一个报告需要…...

python打卡训练营打卡记录day41

知识回顾 数据增强卷积神经网络定义的写法batch归一化:调整一个批次的分布,常用与图像数据特征图:只有卷积操作输出的才叫特征图调度器:直接修改基础学习率 卷积操作常见流程如下: 1. 输入 → 卷积层 → Batch归一化层…...

GD32F103系列工程模版创建记录

准备条件: 1:首先需要下载GD32F103的官方库 2:GD32F103的软件包 3:KEIL5软件 4:单片机GD32F103C8T6 本文已经默认KEIL5已将安装好GD32F103的软件包了 步骤一 基本模版创建 1 打开KEIL5软件,新建工程&am…...

PH热榜 | 2025-05-24

1. Chance AI: Visual Reasoning 标语:通过视觉推理模型即时进行可视化搜索 介绍:Chance AI 是你的视觉小助手——只需拍一张照片,就能揭示你所看到事物背后的故事。通过我们全新的视觉推理功能,它不仅能识别物体,还…...

《高等数学》(同济大学·第7版) 的 详细章节目录

上册 第一章 函数与极限 映射与函数 数列的极限 函数的极限 无穷小与无穷大 极限运算法则 极限存在准则 两个重要极限 无穷小的比较 函数的连续性与间断点 连续函数的运算与初等函数的连续性 闭区间上连续函数的性质 🔹 重点节: 2-3&#xff…...

能源领域新兴技术论坛:EMQ 实时数据引擎构建工业智能中枢

5 月 26 日,由沙特阿美亚洲公司主办的能源领域新兴技术论坛在上海顺利举行。本次论坛聚焦智能工厂、无人机与机器人、可靠性与完整性、先进材料四大技术赛道,吸引了来自全球的能源企业、技术供应商及行业专家。 作为业内知名的 MQ AI 实时数据与智能产…...

kafka 常用知识点

文章目录 前言kafka 常用知识点1. kafka 概念2. 消息共享和广播3. 分区和副本数量奇偶数 前言 如果您觉得有用的话,记得给博主点个赞,评论,收藏一键三连啊,写作不易啊^ _ ^。   而且听说点赞的人每天的运气都不会太差&#xff0…...

Vue 核心技术与实战day07

1. vuex概述 2. 构建 vuex [多组件数据共享] 环境 <template><div id"app"><h1>根组件- {{ title }}- {{ count }}</h1><input :value"count" input"handleInput" type"text"><Son1></Son1>…...

关于5090安装tensorrt(python api)的过程

前提条件 硬件5090 ubuntu24.04 cuda版本12.8 找到适配的tensorrt版本 Nvidia官网 完事了之后找到对应版本tar安装包 tar -xvzf tensorrt-你的安装包.tar 然后记得将路径加入到环境变量中 #在这里插入代码片 gedit ~/.bashrc # 添加 export PATH/PATH/To/TensorRT-你的按安…...

[蓝桥杯]分考场

题目描述 nn 个人参加某项特殊考试。 为了公平&#xff0c;要求任何两个认识的人不能分在同一个考场。 求是少需要分几个考场才能满足条件。 输入描述 输入格式&#xff1a; 第一行&#xff0c;一个整数 nn (1≤n≤1001≤n≤100)&#xff0c;表示参加考试的人数。 第二行…...

CSS专题之层叠上下文

前言 石匠敲击石头的第 15 次 在平常开发的时候&#xff0c;有时候会遇到使用 z-index 调整元素层级没有效果的情况&#xff0c;究其原因还是因为对层叠上下文不太了解&#xff0c;看了网上很多前辈的文章&#xff0c;决定打算写一篇文章来梳理一下&#xff0c;如果哪里写的有问…...

Nginx基础篇(Nginx目录结构分析、Nginx的启用方式和停止方式、Nginx配置文件nginx.conf文件的结构、Nginx基础配置实战)

文章目录 1. Nginx目录结构分析1.1 conf目录1.2 html目录1.3 logs目录1.4 sbin目录 2. Nginx的启用方式和停止方式2.1 信号控制2.1.1 信号2.1.2 调用命令 2.2 命令行控制2.2.1 基础操作类2.2.2 配置测试类2.2.3 进程控制类2.2.4 路径与文件类2.2.5 高级配置类 3. Nginx配置文件…...

Kafka 的 ISR 机制深度解析:保障数据可靠性的核心防线

在 Kafka 的消息处理体系中&#xff0c;数据的可靠性和高可用性是至关重要的目标。而 ISR&#xff08;In-Sync Replicas&#xff0c;同步副本&#xff09;机制作为 Kafka 实现这一目标的关键技术&#xff0c;在消息复制、故障容错等方面发挥着核心作用。接下来&#xff0c;我们…...

移动安全Android——客户端静态安全

一、反编译保护 测试工具 Jadx GitHub - skylot/jadx: Dex to Java decompiler PKID [下载]PKID-APP查壳工具-Android安全-看雪-安全社区|安全招聘|kanxue.com 测试流程 &#xff08;1&#xff09;通过Jadx对客户端APK文件进行反编译&#xff0c;观察是否进行代码混淆 &…...

LeetCode 1524. 和为奇数的子数组数目

好的&#xff01;让我们详细解释 LeetCode 1524. 和为奇数的子数组数目 这道题的思路和解法。 题目&#xff1a; https://leetcode.cn/problems/number-of-sub-arrays-with-odd-sum/description/ 题目分析 问题描述&#xff1a; 给定一个整数数组 arr&#xff0c;返回其中和…...

Redis最佳实践——安全与稳定性保障之连接池管理详解

Redis 在电商应用的连接池管理全面详解 一、连接池核心原理与架构 1. 连接池工作模型 #mermaid-svg-G7I3ukCljlJZAXaA {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-G7I3ukCljlJZAXaA .error-icon{fill:#552222;}…...

核心机制三:连接管理(三次握手)

核心机制一:确认应答 > 实现可靠传输的核心 接受方给发送方返回"应答报文"(ack) 1)发送方能够感知到对方是否收到 2)如果对方没有收到,发送方采取措施 序号按照字节编排 (连续递增) 确认序号按照收到数据的最后一个字节序号 1 核心机制二:超时重传 > 产生丢包…...

HarmonyOS DevEco Testing入门教程

一、DevEco Testing体系架构 分层测试框架 单元测试层&#xff1a;支持JS/TS/ArkTS语言的JUnit风格测试 UI测试层&#xff1a;基于XCTest框架扩展的视觉化测试工具 云测平台&#xff1a;集成华为云真机调试实验室 核心测试能力 分布式测试引擎&#xff1a;支持跨设备协同测…...

记录一次apisix上cros配置跨域失败的问题

安全要求不允许跨域请求&#xff0c;但是业务侧由于涉及多个域名&#xff0c;并且需要共享cookie&#xff0c;所以需要配置跨域。 在apisix上配置了cors如下。 结果安全漏扫还是识别到了跨域请求的漏洞。 调试了cors.lua的插件脚本&#xff0c;发现apisix上是如果不在allowOri…...

Spring Data Redis 实战指南

Spring Data Redis 核心特性 Spring Data Redis 是基于 Redis 的 NoSQL 内存数据结构存储解决方案,为 Spring 应用程序提供与 Redis 交互的高级抽象层。其核心架构设计体现了对现代应用需求的深度适配,主要技术特性可归纳为以下维度: 数据结构支持体系 作为多模型数据存储…...

服务器数据恢复—EMC存储raid5阵列故障导致上层应用崩了的数据恢复案例

服务器存储数据恢复环境&#xff1a; EMC某型号存储中有一组由8块硬盘组建的raid5磁盘阵列。 服务器存储故障&#xff1a; raid5阵列中有2块硬盘离线&#xff0c;存储不可用&#xff0c;上层应用崩了。 服务器存储数据恢复过程&#xff1a; 1、将存储中的所有硬盘编号后取出&a…...

如何保护网络免受零日漏洞攻击?

零日漏洞&#xff08;Zero-Day Vulnerability&#xff09;是指软件或系统中尚未被厂商发现或修补的安全漏洞。这个名称中的“零日”意味着&#xff0c;从漏洞被发现到厂商发布修复补丁的时间是零天&#xff0c;也就是说&#xff0c;黑客可以利用这个漏洞进行攻击&#xff0c;而…...

Python打卡训练营-Day13-不平衡数据的处理

浙大疏锦行 知识点&#xff1a; 不平衡数据集的处理策略&#xff1a;过采样、修改权重、修改阈值交叉验证代码 过采样 过采样一般包含2种做法&#xff1a;随机采样和SMOTE 过采样是把少的类别补充和多的类别一样多&#xff0c;欠采样是把多的类别减少和少的类别一样 一般都是缺…...

【专题】神经网络期末复习资料(题库)

神经网络期末复习资料&#xff08;题库&#xff09; 链接&#xff1a;https://blog.csdn.net/Pqf18064375973/article/details/148332887?sharetypeblogdetail&sharerId148332887&sharereferPC&sharesourcePqf18064375973&sharefrommp_from_link 【测试】 Th…...