多个索引干扰导致索引失效如何解决

news2024/9/17 9:12:21

视频讲解:索引干扰导致索引失效如何解决_哔哩哔哩_bilibili

1 场景说明

表tb_order有订单状态order_status和创建时间create_time的索引。

现在业务的需求是,查询半年内,已支付订单状态的总数。SQL语句如下:

 SELECT
  COUNT(1)
FROM
  tb_order od
WHERE od.`order_status` = 2
  AND od.`create_time` > '2024-03-07' AND od.`create_time` < '2024-09-07';

执行计划如下:

 问题描述:

高效索引create_time没有使用上,order_status单值索引影响了高效索引的使用,如何解决这个问题?

2 create_time失效原因以及两种处理方案讲解

视频详细讲解索引干扰导致索引失效问题的解决方案:索引干扰导致索引失效如何解决_哔哩哔哩_bilibili

3 少量固定值作为单值索引的弊端

使用订单状态值作为单值索引可能会遇到以下几种情况和潜在的弊端:

  1. 选择性差

    • 订单状态通常只有几个不同的值(如“待支付”、“已支付”、“已发货”、“已完成”等)。这样的字段选择性较低,意味着索引中的大多数值都是重复的。对于查询优化器来说,这样的索引可能并不比全表扫描更有效率。
  2. 索引利用率低

    • 如果应用程序查询模式主要是基于订单ID或其他唯一标识符进行查询,那么在订单状态上创建索引并不会提高这些查询的性能。相反,如果查询主要涉及订单状态,那么这种索引可能会有用。
  3. 更新开销

    • 订单状态的变化会触发索引更新。每次状态改变时,都会产生额外的写操作,增加了数据库的负载。如果订单状态频繁变更,这种开销可能会变得显著。
  4. 并发问题

    • 在高并发环境下,如果多个事务同时尝试更新同一个订单的状态,可能会导致索引锁的竞争,从而降低系统的整体吞吐量。
  5. 存储空间浪费

    • 为一个选择性差的字段创建索引会占用额外的空间,而这些空间可能没有得到充分利用,尤其是在B树索引中,每个不同的值都会占用一定的空间。
  6. 查询优化器的行为

    • MySQL的查询优化器可能不会优先考虑使用选择性差的索引来执行查询。在某些情况下,即使存在索引,优化器也可能会选择全表扫描或者其他更高效的访问路径。

4 没有开启查询缓存,为什么第二次查询比第一次查询快了

即使没有开启查询缓存(Query Cache),第二次查询仍然可能比第一次查询快,这是因为数据库管理系统(DBMS)内部有多种机制可以提高查询性能,包括但不限于以下几种情况:

  1. 缓冲池(Buffer Pool):大多数关系型数据库都有一个缓冲池,用于缓存最近访问的数据页。当查询再次执行时,如果所需的数据已经存在于缓冲池中,则不需要从磁盘读取,这样可以显著加快查询速度。

  2. 读取缓存(Read Cache):操作系统通常也有自己的文件系统缓存,会将最近读取的数据存储在内存中。如果查询的数据已经在操作系统缓存中,那么第二次查询可以直接从内存中读取数据,而不需要访问磁盘。

  3. 查询解析与优化:第一次执行查询时,数据库需要解析SQL语句并生成执行计划。这个过程可能比较耗时。第二次执行相同的查询时,数据库可以直接重用已有的执行计划,减少了解析和优化的时间。

  4. 索引缓存:索引本身也可能被缓存在内存中。当索引被首次使用时,其部分或全部可能被加载到内存中,后续查询可以直接利用缓存的索引来定位数据,从而加速查询。

  5. 连接池:如果是在应用层使用了数据库连接池,那么建立数据库连接的时间可以忽略不计,因为连接已经被复用了。

  6. 统计信息:一些数据库系统会在第一次执行查询时收集统计信息,这些信息在第二次执行时会被利用来更好地优化查询。

因此,即使没有启用查询缓存,由于上述机制的存在,第二次查询仍然可以更快。如果你想要验证这些假设,可以通过监控工具来检查数据库的缓存命中率、执行计划以及其他性能指标,以确定具体的原因。此外,也可以通过关闭或限制内存缓冲池大小来观察查询性能的变化,从而进一步确认是哪些因素在起作用。

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

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

相关文章

韦季李输入法_输入法和鼠标的深度融合

在数字化输入的新纪元&#xff0c;传统键盘输入方式正悄然进化。以往&#xff0c;面对实体键盘&#xff0c;我们常需目光游离于屏幕与键盘之间&#xff0c;以确认指尖下的精准位置。而屏幕键盘虽直观可见&#xff0c;却常因占据屏幕空间&#xff0c;迫使我们在操作与视野间做出…

Windows系统下安装JMeter

目录 一、官网下载JMeter 二、运行 JMeter 一、官网下载JMeter JMeter 官网安装地址 Apache JMeter - Apache JMeter™https://jmeter.apache.org/ 下载Windows版本 下载完成后 解压 二、运行 JMeter 打开bin目录 下面两个文件其中一个均可运行双击jmeter.bat 或者使用…

支持黑神话悟空的超长视频理解,Qwen2-VL多模态大模型分享

Qwen2-VL是由阿里巴巴达摩院开发并开源的第二代视觉与语言多模态人工智能模型。 Qwen2-VL结合了视觉理解和自然语言处理的能力&#xff0c;使得它能够处理和理解图像、视频以及文本数据。 Qwen2-VL支持多种语言&#xff0c;包括但不限于英语、中文、大多数欧洲语言、日语、韩…

【分支-快速排序】

【分支-快速排序】 1. 颜色分类1.1 题目来源1.2 题目描述1.3 题目解析 2. 排序数组2.1 题目来源2.2 题目描述2.3 题目解析 3. 数组中的第K个最大元素3.1 题目来源3.2 题目描述3.3 题目解析 4. 库存管理 III4.1 题目来源4.2 题目描述4 .3 题目解析 1. 颜色分类 1.1 题目来源 7…

JS基础学习笔记

1.引入方式 内部脚本 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document</title> <…

为什么要使用大模型RAG一体机

使用大模型RAG&#xff08;Retrieval-Augmented Generation&#xff09;一体机&#xff0c;如AntSKPro AI 离线知识库一体机&#xff0c;有以下几个原因和优势&#xff1a; 提高效率&#xff1a;RAG模型结合了检索&#xff08;Retrieval&#xff09;和生成&#xff08;Generati…

鸿蒙(API 12 Beta6版)GPU加速引擎服务【自适应VRS】

XEngine Kit提供自适应VRS功能&#xff0c;其通过合理分配画面的计算资源&#xff0c;视觉无损降低渲染频次&#xff0c;使不同的渲染图像使用不同的渲染速率&#xff0c;能够有效提高渲染性能。 接口说明 以下接口为自适应VRS设置接口&#xff0c;如要使用更丰富的设置和查询…

windows10-VMware17-Ubuntu-22.04-海康2K摄像头兼容问题,求解(已解决)

文章目录 1.webrtc camera测试2.ffmpeg 测试3.Ubuntu 自带相机4.解决办法 环境&#xff1a;windows10系统下&#xff0c;VMware的Ubuntu-22.04系统 问题&#xff1a;摄像头出现兼容问题&#xff0c;本来是想开发测试的&#xff0c;Ubuntu方便些。买了海康2K的USB摄像头&#xf…

人机交互与现代战争

人机交互技术在现代战争中的应用越来越广泛&#xff0c;它可以帮助士兵更好地完成任务&#xff0c;提高作战效能&#xff0c;减少人员伤亡。人机交互与认知在军事应用方面的进展有很多&#xff0c;比如&#xff1a; &#xff08;1&#xff09;虚拟现实和增强现实技术&#xff1…

PAT甲级-1085 Perfect Sequence

题目 题目大意 在一组数中找到一个完美数列&#xff0c;满足M < mp&#xff0c;M是该数列的最大值&#xff0c;m是最小值&#xff0c;p是题目给定的一个常数。 思路 模拟或者二分法。二分法可用upper_bound()函数实现。 知识点 upper_bound() 和 lower_bound() 函数在&…

C高级编程 第十六天(树 二叉树)

1.树 1.1结构特点 非线性结构&#xff0c;有一个直接前驱&#xff0c;但可能有多个直接后继有递归性&#xff0c;树中还有树可以为空&#xff0c;即节点个数为零 1.2相关术语 根&#xff1a;即根结点&#xff0c;没有前驱叶子&#xff1a;即终端结点&#xff0c;没有后继森…

02-java实习工作一个多月-经历分享

一、描述一下最近不写博客的原因 离我发java实习的工作的第一天的博客已经过去了一个多月了&#xff0c;本来还没入职的情况是打算每天工作都要写一份博客来记录一下的&#xff08;最坏的情况也是每周至少总结一下的&#xff09;&#xff0c;其实这个第一天的博客都是在公司快…

笔记整理—内核!启动!—kernel部分(2)从汇编阶段到start_kernel

kernel起始与ENTRY(stext)&#xff0c;和uboot一样&#xff0c;都是从汇编阶段开始的&#xff0c;因为对于kernel而言&#xff0c;还没进行栈的维护&#xff0c;所以无法使用c语言。_HEAD定义了后面代码属于段名为.head .text的段。 内核起始部分代码被解压代码调用&#xff0c…

深入手撕链表

链表 分类概念单链表增尾插头插插入 删尾删头删删除 查完整实现带头不带头 双向链表初始化增尾插头插插入 删查完整代码 数组 分类 #mermaid-svg-qKD178fTiiaYeKjl {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-qK…

Java 入门指南:JVM(Java虚拟机)—— Java 内存运行时的数据区域

前言 对于 Java 程序员来说&#xff0c;在虚拟机自动内存管理机制下&#xff0c;不再需要像 C/C程序开发程序员这样为每一个 new 操作去写对应的 delete/free 操作&#xff0c;不容易出现内存泄漏和内存溢出问题。 由于程序员把内存控制权利交给 Java 虚拟机&#xff0c;一旦…

【CSS in Depth 2 精译_025】4.3 弹性布局的方向

当前内容所在位置&#xff08;可进入专栏查看其他译好的章节内容&#xff09; 第一章 层叠、优先级与继承&#xff08;已完结&#xff09; 1.1 层叠1.2 继承1.3 特殊值1.4 简写属性1.5 CSS 渐进式增强技术1.6 本章小结 第二章 相对单位&#xff08;已完结&#xff09; 2.1 相对…

NISP 一级 | 2.3 身份认证

关注这个证书的其他相关笔记&#xff1a;NISP 一级 —— 考证笔记合集-CSDN博客 0x01&#xff1a;身份认证基本方法 身份认证是用户登录系统或网站面对的第一道安全防线&#xff0c;如输入账号口令来登录。身份认证是在网络中确认操作者身份的过程。身份认证一般依据以下三种情…

Thread如何划分为Warp?

1 .Thread如何划分为Warp? https://jielahou.com/code/cuda/thread-to-warp.html Thread Index和Thread ID之间有什么关系呢&#xff1f;&#xff08;线程架构参考这里&#xff1a;CUDA C Programming Guide (nvidia.com)open in new window&#xff09; 1维的Thread Index&am…

ORCAD出BOM--位号在同一个Excel格子里

所有相同属性的器件都在同一个格子里 Tools\ Bill of Materials, 注意勾选Open in excel. 勾选Open in excel, 所有相同属性的器件都在同一个格子里 不勾选Open in excel, 5个相同属性的器件都在同一个格子里

代码随想录Day 39|打家劫舍问题,leetcode题目:198.打家劫舍、213.打家劫舍Ⅱ、337.打家劫舍Ⅲ

提示&#xff1a;DDU&#xff0c;供自己复习使用。欢迎大家前来讨论~ 文章目录 题目题目一&#xff1a;198.打家劫舍解题思路&#xff1a; 题目二&#xff1a;213.打家劫舍II解题思路&#xff1a; 题目三&#xff1a; 337.打家劫舍 III解题思路暴力递归记忆化递推动态规划 总结…