数据库复合索引设计:为什么等值查询列应该放在范围查询列前面?

前言

作为后端开发工程师,我们经常会遇到数据库查询性能问题。在一次系统优化中,我发现一个简单的索引顺序调整竟然让查询速度提升了10倍!这让我意识到复合索引列顺序的重要性。今天,我就来分享一下这个经验,希望能帮助大家避免类似的性能陷阱。

一次真实的性能优化经历

上周,我接手优化一个运行缓慢的订单查询接口。原查询如下:

SELECT * FROM orders 
WHERE create_time > '2023-01-01' 
AND status = 'completed'
ORDER BY amount DESC
LIMIT 100;

这个查询在百万级数据表中需要3秒多才能返回结果,明显不符合要求。

问题分析

我先用EXPLAIN查看了执行计划:

EXPLAIN SELECT * FROM orders 
WHERE create_time > '2023-01-01' 
AND status = 'completed'
ORDER BY amount DESC
LIMIT 100;

结果显示数据库进行了全表扫描,使用了filesort排序。原来表上只有一个索引:

INDEX idx_create_time_status (create_time, status)

解决方案

根据复合索引的最佳实践,我调整了索引列的顺序:

DROP INDEX idx_create_time_status ON orders;
CREATE INDEX idx_status_create_time ON orders(status, create_time);

再次执行查询,响应时间从3秒多降到了300毫秒左右!

为什么这样有效?

1. 等值条件优先原则

  • status = 'completed'是等值查询

  • create_time > '2023-01-01'是范围查询

数据库能更高效地使用等值条件过滤数据。在我们的案例中,completed状态的订单只占总量的10%,先过滤这部分数据大大减少了需要处理的数据量。

2. 范围查询的"阻断"效应

当范围查询列在前时,后面的列通常无法有效使用索引。而等值列在前时,范围查询仍然可以利用索引。

3. 覆盖索引优势

新索引还能支持这样的查询:

SELECT status, create_time FROM orders 
WHERE status = 'completed' 
AND create_time > '2023-01-01';

这个查询可以完全通过索引完成,无需访问表数据。

实际应用建议

  1. 分析查询模式:使用慢查询日志找出高频查询

  2. 检查执行计划:EXPLAIN是必备工具

  3. 考虑选择性:高选择性的等值条件列应该靠前

  4. 权衡索引数量:不是越多越好,每个索引都有维护成本

常见误区

  1. 盲目添加单列索引:不如设计好的复合索引有效

  2. 忽视列顺序:以为只要包含这些列就行

  3. 过度索引:为每个查询都创建独立索引

总结

通过这个案例,我深刻理解了复合索引列顺序的重要性。记住这个简单的原则:等值查询列在前,范围查询列在后,往往能带来意想不到的性能提升。

你在索引优化方面有什么经验或问题?欢迎在评论区分享交流!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/news/914224.shtml
繁体地址,请注明出处:http://hk.pswp.cn/news/914224.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【PMP备考】每日一练 - 2

1、一个建筑项目的项目经理发现,他管理的项目所在地附近正在新建一条新的水管线。公司政策要求,在他的团队继续完成这个项目之前,必须先填写一系列有关城市环境变化的表格。这是那两种情况的例子?(选2个选项&#xff0…

【三】ObservableCollection 与 List 的区别

文章目录前言一、核心概念简介ObservableCollectionList二、关键差异对比三、典型使用场景ObservableCollection 的适用场景List 的适用场景四、在Community Toolkit MVVM中使用ObservableCollection<Data>和List<Data>场景1&#xff1a;动态列表&#xff08;Obser…

网安-SSRF-pikachu

目录 SSRF:Server-Side Request Forgery PHP curl PHP 可能引起SSRF的函数 PHP其他函数 CURL其他协议 SSRF利用&#xff1a; SSRF的发现 工具 SSRF的防御 pikachu-SSRF 一&#xff1a;curl 1.访问连接&#xff1a; 2.读取本地文件 3.dict协议扫描主机端口 二&…

在Centos系统上如何有效删除文件和目录的指令汇总

CentOS系统是一款开源的类Unix操作系统&#xff0c;极其亲和程序员和技术人员。这个系统最大的优势就是其高度自由化的特性&#xff0c;世界各地的开发者可以依照实际需求去修改和运行。在这个操作系统中&#xff0c;如果你想删除文件和目录&#xff0c;你可以使用各式各样的命…

Spring(四) 关于AOP的源码解析与思考

Spring&#xff08;四&#xff09; 关于AOP的源码解析与思考 每种语言都有其独特的机制和特点&#xff0c;那么说到Java你可能会首先想到反射&#xff0c;反射是Java语言提供的一种能够在程序运行时动态操作类或对象的能力&#xff0c;比如获取某个对象的类定义、获取类声明的属…

Android 15 Settings 搜索框:引入关键字过滤功能

在日常使用 Android 手机时,我们经常会用到“设置”应用中的搜索功能来快速定位所需选项。然而,有时搜索结果可能会包含一些我们不希望看到或者过于宽泛的条目。 本文将深入探讨这一变化,通过分析 SearchResultsAdapter.java 文件中的代码修改,揭示 Android 如何实现对特定…

Python-魔术方法-创建、初始化与销毁-hash-bool-可视化-运算符重载-容器和大小-可调用对象-上下文管理-反射-描述器-二分-学习笔记

序 欠4前年的一份笔记 &#xff0c;献给今后的自己。 魔术方法 特殊属性查看属性如果dir&#xff08;lobji&#xff09;参数obj包含方法 __dir__()&#xff0c;该方法将被调用。如果参数obj不包含__dir__()&#xff0c; 该方法将最大限度地收集参数信息。 dir()对于不同类型的对…

redis的一些疑问

spring集成redisCacheEvict(value "commonCache", key "#uniqueid_userInfo")什么时候会执行缓存移除呢&#xff1f;如果方法执行异常是否移除&#xff1f;如果缓存不存在还会移除么&#xff1f;这个移除会在redis的执行历史命令中监控到么&#xff1f;.…

3.检查函数 if (!CheckStart()) return 的妙用 C#例子

在桌面/WPF 开发中&#xff0c;我们经常需要在按钮事件里先判断“能不能做”&#xff0c;再决定“怎么做”。如果校验不过&#xff0c;就直接返回&#xff1b;校验通过&#xff0c;才继续执行业务逻辑。 今天分享一个极简写法&#xff1a;if (!CheckStart()) return;&#xff0…

炎热工厂救援:算法打造安全壁垒

高温天气下智慧工厂&#xff1a;算法赋能&#xff0c;安全救援无忧背景&#xff1a;极端高温下工厂的严峻挑战近年来&#xff0c;极端高温天气频发&#xff0c;部分地区气温接近甚至超过50℃。在这样酷热的环境中&#xff0c;工厂面临着诸多严峻问题。一方面&#xff0c;高温容…

pgsql模板是什么?

查找所有的数据库 select datname from pg_database运行该命令后&#xff0c;我们会发现其中出现了一些其它的数据库接下来&#xff0c;我们分析 template0 和 template1 的作用。template1 template1 是 PostgreSQL 默认用于创建新数据库的模板。当执行 CREATE DATABASE new_d…

LLM 不知道答案,但是知道去调用工具获取答案?

思考&#xff1a; LLM 自己“不知道”某个事实性问题的答案&#xff0c;但仍然能“知道”去调用工具获取正确答案&#xff0c;这听起来确实有点像个悖论该内容触及了大型语言模型&#xff08;LLM&#xff09;的核心局限性以及&#xff08;Agents&#xff09;的智能所在。实际上…

2025年7月11日学习笔记一周归纳——模式识别与机器学习

2025年7月11日学习笔记&一周归纳——模式识别与机器学习一.一周工作二.我的一些笔记汇总三.发现的一些新的学习资料和爱用好物1.百度网盘AI笔记&#xff1a;2.b站资料&#xff1a;3.听说的一些好书&#xff1a;一.一周工作 本周学习了清华大学张学工汪小我老师的模式识别与…

LeetCode 138题解 | 随机链表的复制

随机链表的复制一、题目链接二、题目三、分析四、代码一、题目链接 138.随机链表的复制 二、题目 三、分析 数据结构初阶阶段&#xff0c;为了控制随机指针&#xff0c;我们将拷贝结点链接在原节点的后面解决&#xff0c;后面拷贝节点还得解下来链接&#xff0c;非常麻烦。这…

【计算机存储架构】分布式存储架构

引言&#xff1a;数据洪流时代的存储革命“数据是新时代的石油” —— 但传统存储正成为制约数据价值释放的瓶颈核心矛盾&#xff1a;全球数据量爆炸增长&#xff1a;IDC预测2025年全球数据量将达175ZB&#xff08;1ZB10亿TB&#xff09;传统存储瓶颈&#xff1a;单机IOPS上限仅…

【Linux-云原生-笔记】数据库操作基础

一、什么是数据库&#xff1f;数据库就是一个有组织、可高效访问、管理和更新的电子化信息&#xff08;数据&#xff09;集合库。简单来说&#xff0c;数据库就是一个高级的Excel二、安装数据库并初始化1、安装数据库&#xff08;MySQL&#xff09;dnf search一下mysql数据库的…

HarmonyOS中各种动画的使用介绍

鸿蒙&#xff08;HarmonyOS&#xff09;提供了丰富的动画能力&#xff0c;涵盖属性动画、显式动画、转场动画、帧动画等多种类型&#xff0c;适用于不同场景的交互需求。以下是鸿蒙中各类动画的详细解析及使用示例&#xff1a;1. 属性动画&#xff08;Property Animation&#…

CSP-S 模拟赛 10

T1 洛谷 U490727 返乡 思路 首先要意识到一个问题&#xff0c;就是如果所有人总分一定&#xff0c;那么是不会出现偏序的。 可以感性理解一下&#xff0c;就是对于 i,ji, ji,j&#xff0c; 若 ai≤aj,bi≤bja_i \leq a_j, b_i \leq b_jai​≤aj​,bi​≤bj​&#xff0c;那么…

CMD,PowerShell、Linux/MAC设置环境变量

以下是 CMD&#xff08;Windows&#xff09;、PowerShell&#xff08;Windows&#xff09;、Linux/Mac 在 临时/永久 环境变量操作上的对比表格&#xff1a;环境变量操作对照表&#xff08;CMD vs PowerShell vs Linux/Mac&#xff09;操作CMD&#xff08;Windows&#xff09;P…

MySQL(131)如何解决MySQL CPU使用率过高问题?

解决MySQL CPU使用率过高的问题需要从多个方面进行排查和优化&#xff0c;包括查询优化、索引优化、配置优化和硬件资源的合理使用等。以下是详细的解决方案和相应的代码示例。 一、查询优化 1. 检查慢查询 使用MySQL的慢查询日志来找到执行时间长的查询。 SET GLOBAL slow_que…