【Mysql】索引下推、索引合并详解

文章目录

    • 1. 索引下推(Index Condition Pushdown, ICP)
      • 定义
      • 工作机制
      • 实现过程
      • 优化的典型场景
    • 2. 索引合并(Index Merge)
      • 定义
      • 索引合并方式
      • 使用限制
    • 3. 对比与应用场景
      • 选用建议

这篇文章就简单的给大家介绍下索引下推、索引合并

1. 索引下推(Index Condition Pushdown, ICP)

定义

索引下推是 MySQL 5.6 引入的一项优化,用于减少回表次数。它将部分查询条件的过滤工作推到存储引擎层,而不是在 MySQL 服务层处理,从而提升查询效率。

工作机制

在范围查询或复合索引场景下,MySQL 会利用索引列中的更多信息进行过滤,仅回表获取满足条件的数据。这减少了不必要的回表操作。

实现过程

  1. 未使用索引下推

    • 查询语句:

      SELECT * FROM user1 WHERE name LIKE 'A%' AND age = 40;
      
    • 执行过程:

      1. 存储引擎通过索引 name 定位到匹配 name LIKE 'A%' 的数据范围。
      2. 每条记录都回表获取完整行数据。
      3. 回表后,在服务层进一步过滤 age = 40 的条件。
  2. 使用索引下推

    • 查询语句:

      SELECT * FROM user1 WHERE name LIKE 'A%' AND age = 40;
      
    • 执行过程:

      1. 存储引擎在二级索引中先判断 name LIKE 'A%'age = 40 的条件。
      2. 仅当二级索引满足所有条件时才回表获取完整行数据。
    • 优化效果:通过在存储引擎层过滤不符合条件的数据,回表次数大幅减少。

优化的典型场景

在范围查询中,通过复合索引的多个字段过滤条件,尤其是 SELECT * 查询。


2. 索引合并(Index Merge)

定义

索引合并是 MySQL 从 5.1 开始支持的一种优化技术,允许 SQL 查询同时使用多个单列索引,通过合并结果提高查询性能。

索引合并方式

  1. 交集(INTERSECT)

    • 使用场景:查询条件是 AND

    • 示例:

      SELECT * FROM user WHERE name = '赵六' AND age = 22;
      
    • 执行过程:

      • 分别通过 idx_nameidx_age 获取符合条件的主键 ID 列表。
      • 对主键 ID 列表取交集。
      • 根据交集中的 ID 回表查询。
  2. 并集(UNION)

    • 使用场景:查询条件是 OR

    • 示例:

      SELECT * FROM user WHERE name = '赵六' OR age = 22;
      
    • 执行过程:

      • 分别通过 idx_nameidx_age 获取符合条件的主键 ID 列表。
      • 对主键 ID 列表取并集,并去重。
      • 根据去重后的 ID 回表查询。
  3. 排序后取并集(SORT-UNION)

    • 使用场景:当主键 ID 无序时(上面2种id是有序的)。

    • 示例:

      SELECT * FROM user WHERE name = '赵六' OR age > 22;
      
    • 执行过程:

      • 对主键 ID 进行排序。
      • 然后取并集。
      • 根据并集中的 ID 回表查询。

使用限制

  • 索引顺序要求:取交集和并集都要求各索引列返回的主键 ID 是有序的。
  • 优化范围有限:对于范围条件(如 age > 22),如果无法返回有序的主键 ID,则可能无法直接使用索引合并。

3. 对比与应用场景

特性索引下推索引合并
MySQL版本5.6+5.1+
优化目标减少回表次数组合使用多个索引
适用场景复合索引、多条件过滤单列索引、多条件组合查询
典型查询条件ANDANDOR
性能提升原理存储引擎层提前过滤数据合并多个索引结果

选用建议

  1. 索引下推:优先在复合索引设计中,充分利用索引列的过滤能力。
  2. 索引合并:适用于无法设计复合索引,但查询涉及多个单列索引的情况。

通过索引下推和索引合并的组合优化,可以显著提升查询性能,尤其是在大数据量的场景中表现尤为明显。


博客首页:总是学不会.

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

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

相关文章

8_Sass 颜色函数 --[CSS预处理]

Sass 提供了一系列的颜色函数,允许开发者在 CSS 中动态地创建和操作颜色。这些函数可以用于生成调色板、调整颜色的亮度或饱和度、混合颜色等,从而提高样式表的灵活性和可维护性。以下是 Sass 中一些常用的颜色函数及其用法示例: 1. adjust-…

工业大数据分析算法实战-day04

文章目录 day04统计分析概率分布参数估计假设检验 统计分布拟合1.基于核函数的非参数方法2. 单概率分布的参数化拟合3. 混合概率分布估计 线性回归模型1. OLS模型(普通最小二乘法)2. OLS模型检验3. 鲁棒线性回归4. 结构复杂度惩罚(正则化&…

vue3-tp8-Element:对话框实现

效果 参考框架 Dialog 对话框 | Element Plus 具体实现 一、建立view页面 /src/views/TestView.vue 二、将路径写入路由 /src/router/index.js import { createRouter, createWebHistory } from vue-router import HomeView from ../views/HomeView.vueconst router create…

VMware ESXi上创建Ubuntu虚拟机并实现远程SSH访问全攻略

文章目录 前言1. 在VMware ESXI中创建Ubuntu虚拟机2. Ubuntu开启SSH远程服务3. 安装Cpolar工具4. 使用SSH客户端远程访问Ubuntu5. 固定TCP公网地址 前言 本文主要介绍如何在VMware ESXi上创建一台Ubuntu 22.04虚拟机,并通过Cpolar内网穿透工具配置公网地址&#xf…

HQChart使用教程30-K线图如何对接第3方数据42-DRAWTEXTREL,DRAWTEXTABS数据结构

HQChart使用教程30-K线图如何对接第3方数据42-DRAWTEXTREL,DRAWTEXTABS数据结构 效果图DRAWTEXTREL示例数据结构说明nametypecolorDrawVAlignDrawAlignDrawDrawTypeDrawDataFont DRAWTEXTABS示例数据结构说明nametypecolorDrawVAlignDrawAlignDrawDrawTypeDrawDataFont 效果图 …

【电子元器件】电感基础知识

本文章是笔者整理的备忘笔记。希望在帮助自己温习避免遗忘的同时,也能帮助其他需要参考的朋友。如有谬误,欢迎大家进行指正。 一、 电感的基本工作原理 1. 电感的基本工作原理如下: (1) 当线圈中有电流通过时&#…

大模型的文件有哪些?

在大模型仓库(如Hugging Face)中,例如:https://modelscope.cn/models/ZhipuAI/glm-4-9b-chat/files,通常会发现以下几类文件: 模型权重文件:存储训练好的模型参数,是模型推理和微调…

Python pyinstaller图形化打包工具

Python pyinstaller图形化打包工具 1.简介: 一个使用Python PYQT5制作的关于pyinstaller打包工具,代替传统的cmd黑窗口模式打包页面,实现更快捷方便的python打包体验。资源已打包,大家可自行下载。 相关功能: 识别…

canal安装使用

简介 canal [kənl],译意为水道/管道/沟渠,主要用途是基于 MySQL 数据库增量日志解析,提供增量数据订阅和消费 工作原理 canal 模拟 MySQL slave 的交互协议,伪装自己为 MySQL slave ,向 MySQL master 发送 dump 协议…

专业140+总分400+北京理工大学826信号处理导论考研经验北理工电子信息与通信工程,真题,大纲,参考书。

考研总分400,专业826信号处理导论(信号与系统和dsp)140,成功上岸北理工,虽然已经一段时间,但是后劲很大,每每回想还是昨日事,群里同学多次要求分享自己的一些经验,感谢大…

pdb调试器详解

文章目录 1. 启动 pdb 调试器1.1 在代码中插入断点1.2 使用命令行直接调试脚本 2. 常用调试命令2.1 基本命令2.2 高级命令2.3 断点操作 3. 调试过程示例4. 调试技巧4.1 条件断点4.2 自动启用调试4.2.1 运行程序时指定 -m pdb4.2.2在代码中启用 pdb.post_mortem4.2.3 使用 sys.e…

基于Spring Boot的同城宠物照看系统的设计与实现

一、摘要 在快节奏的现代生活中,宠物已成为许多家庭不可或缺的一部分。然而,宠物照看服务的需求也随之增长。为了满足这一需求,我们设计并实现了一款同城宠物照看系统,该系统利用Java技术和MySQL数据库,为用户提供一个…

【Qt】QWidget中的常见属性及其作用(一)

目录 一、 enabled 例子: 二、geometry 例子: window fram 例子 : 四、windowTiltle 五、windowIcon 例子: qrc机制 创建qrc文件 例子: qt中的很多内置类都是继承自QWidget的,因此熟悉QWidget的…

全栈开发:后台管理系统时代的技术破局之道

在当前的互联网发展阶段,许多二三线城市的互联网项目正在经历一个显著的转变。传统的To C项目逐渐减少,取而代之的是大量的企业级后台管理系统。在这样的背景下,全栈开发——特别是前端加Java的组合,正在成为一个备受关注的发展方…

【ubuntu24.04】PDFMathTranslate 本地PDF翻译GPU部署

https://huggingface.co/spaces/reycn/PDFMathTranslate-Docker排不上号官方都是要安装包,感觉可以本地试着源码部署一下, http://localhost:7860/官方是这个端口,但是我本地启动是:5000IDEA 里本地 backend启动效果 GUI 是监听7860的

挺详细的记录electron【V 33.2.0】打包vue3项目为可执行程序

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言 一、直接看效果 二、具体步骤 1.安装配置electron 1.将 electron 包安装到应用的开发依赖中。 2.安装electron-packager依赖(打包可执行文件&#…

西瓜甜不甜

西瓜甜不甜?有人就会说了,这还不简单,拿把刀,把西瓜劈开,吃两口,你不就知道了。但这有几个问题,值得探讨,我们来看下面这副图: 如果西瓜是在货摊上,是卖主的西…

【sgFileLink】自定义组件:基于el-link、el-icon标签构建文件超链接组件,支持垃圾桶删除、点击预览视频/音频/图片/PDF格式文件

sgFileLink源代码 <template><div :class"$options.name"><el-link click.stop"clickFile(data)"><img :src"getSrc(data)" /><span>{{ getFileNameAndSize(data) }}</span></el-link><el-linkcl…

电容的哪些事儿

电容的串并连 电容并联&#xff0c;两电容电压相同&#xff0c;C并C1C2 耐压取较小的&#xff0c;然后再做降额处理 电容串联&#xff0c;两电容电量相同&#xff0c;1/C串1/C11/C2。根据两电容电量相同&#xff0c;Qmin{C1U1,C2U2}&#xff0c;耐压值Umin{C1U1/C2,U2}min{C2…

在 Kibana 中为 Vega Sankey 可视化添加过滤功能

作者&#xff1a;来自 Elastic Tim Bosman 及 Miloš Mandić 有兴趣在 Kibana 中为 Vega 可视化添加交互式过滤器吗&#xff1f;了解如何利用 “kibanaAddFilter” 函数轻松创建动态且响应迅速的 Sankey 可视化。 在这篇博客中&#xff0c;我们将了解如何启用 Vega Sankey 可视…