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

MySQL单表查询时索引使用情况

本文针对 MySQL 单表查询时索引使用的几种场景情况进行分析。

假设有一个表如下:

CREATE TABLE single_table (id INT NOT NULL AUTO_INCREMENT,key1 VARCHAR(100),key2 INT,key3 VARCHAR(100),key_part1 VARCHAR(100),key_part2 VARCHAR(100),key_part3 VARCHAR(100),common_field VARCHAR(100),PRIMARY KEY (id),KEY idx_key1 (key1),UNIQUE KEY idx_key2 (key2),KEY idx_key3 (key3),KEY idx_key_part(key_part1, key_part2, key_part3)
) Engine=InnoDB CHARSET=utf8;

多个索引仅单个生效

SELECT * FROM single_table WHERE key1 = 'abc' AND key2 > 1000;

上面的查询可以拆分为两个步骤:

  1. 查询 key1 或 key2 对应的二级索引,根据过滤条件得到索引上的记录。
  2. 根据主键进行回表,拿到完整的记录,后根据另一个条件进行过滤。

这里的第一步选取哪个二级索引进行过滤,主要取决于优化器认为哪个条件到对应的二级索引中查询扫描的行数会更少。

我们假设 key1 对应的索引需要扫描的行数更少,那么查询时就会先在对应的二级索引树中过滤出 key1 = ‘abc’ 的记录,再根据该记录上的主键 id 去进行回表拿到完整的记录,最后按 key2 > 1000 进行过滤。

索引不生效

SELECT * FROM single_table WHERE key2 > 100 OR common_field = 'abc';

上面的例子中两个过滤条件通过 OR 连接,且只有 key2 列存在索引 idx_key2 。这是一种典型的索引失效场景。

原因是,条件 key2 > 100 和条件 common_field = ‘abc’ 之间是“OR”的关系。这代表着我们不能先按条件 key2 > 100 在二级索引中进行过滤,然后再进行回表,再按条件 common_field 进行过滤。

因此,在该查询中索引相当于失效,查询会走全表扫描。

索引合并

索引合并(index merge)指的是在一次查询中使用到多个二级索引,以此来优化查询效率。

具体的索引合并算法有下边三种:

一:Intersection合并(适用于使用不同索引的搜索条件之间使用AND连接起来的情况)

不过 MySQL 在某些特定的情况下才可能会使用到 Intersection 索引合并:

  • 情况一:一个或多个二级索引的列都是等值匹配。且对于联合索引来说,在联合索引中的每个列都必须等值匹配,不能出现只匹配部分列的情况。
  • 情况二:主键列可以是范围匹配

二:Union合并(适用于使用不同索引的搜索条件之间使用OR连接起来的情况)

  • 情况一:二级索引列是等值匹配的情况,对于联合索引来说,在联合索引中的每个列都必须等值匹配,不能出现只出现匹配部分列的情况。
  • 情况二:主键列可以是范围匹配
  • 情况三:使用 Intersection 索引合并的搜索条件

三:Sort-Union合并
适合用于每个索引过滤完后集合较小,即使按主键排序一下,再回表,访问成本也不会太高。

需要注意的是,上面提到的索引合并的情况都是必要不充分条件。意思是满足了这些条件,不一定会进行索引的合并(得看优化器认为什么样的“访问方法”成本更低)。但一旦发生了索引合并,就一定需要满足下面提到的条件。

参考

《MySQL是怎样运行的》

相关文章:

MySQL单表查询时索引使用情况

本文针对 MySQL 单表查询时索引使用的几种场景情况进行分析。 假设有一个表如下: CREATE TABLE single_table (id INT NOT NULL AUTO_INCREMENT,key1 VARCHAR(100),key2 INT,key3 VARCHAR(100),key_part1 VARCHAR(100),key_part2 VARCHAR(100),key_part3 VARCHAR(1…...

Qt邮箱程序改良版(信号和槽)

上一版代码可以正常使用,但是会报错 上一篇文章 错误信息 "QSocketNotifier: Socket notifiers cannot be enabled or disabled from another thread" 指出了一个问题,即在非主线程中尝试启用或禁用套接字通知器(QSocketNotifier)…...

入门到精通mysql数据(四)

5、运维篇 5.1、日志 5.1.1、错误日志 错误日志是MySQL中最重要的日志之一,它记录了当mysqld启动和停止,以及服务器在运行过程中发生任何严重错误时的相关信息。当数据库出现任何故障导致无法正常使用时,建议首先查看此日志。 该日志是默认开启的,默认存放目录/var/log…...

Java 设计模式 详解

在Java开发中,设计模式是一种常见的、成熟的解决方案,用于应对特定的设计问题和复杂性管理。以下是一些常用的设计模式,它们可以分为三类:创建型模式、结构型模式和行为型模式。 一、创建型模式 创建型模式主要负责对象的创建&a…...

卡尔曼滤波学习资料汇总

卡尔曼滤波学习资料汇总 其实,当初的目的,是为了写 MPU6050 的代码的,然后不知不觉学了那么多,也是因为好奇、感兴趣吧 有些还没看完,之后笔记也会同步更新的 学习原始材料 【卡尔曼滤波器】1_递归算法_Recursive P…...

linux003.在ubuntu中安装cmake的方法

1.cmake安装程序下载 https://cmake.org/files/v3.30/ 2.解压并下载包 解压cmake压缩包 tar -xvzf cmake.tar.gz进入解压目录 cd cmake-<version>编辑~/.bashrc nano ~/.bashrc在文件的末尾添加如下代码 export PATH/home/xwl/software/cmake/bin:$PATH然后运行以…...

EtherNet/IP转Profinet网关连接发那科机器人配置实例解析

本案例主要展示了如何通过Ethernet/IP转Profinet网关实现西门子1200PLC与发那科搬运机器人的连接。所需的设备有西门子1200PLC、开疆智能Ethernet/IP转Profinet网关以及Fanuc机器人。 具体配置步骤&#xff1a;打开西门子博图配置软件&#xff0c;添加PLC。这是配置的第一步&am…...

自动化运维-检测Linux服务器CPU、内存、负载、IO读写、机房带宽和服务器类型等信息脚本

前言&#xff1a;以上脚本为今年8月1号发布的&#xff0c;当时是没有任何问题&#xff0c;但现在脚本里网络速度测试py文件获取不了了&#xff0c;测速这块功能目前无法实现&#xff0c;后面我会抽时间来研究&#xff0c;大家如果有建议也可以分享下。 脚本内容&#xff1a; #…...

ubuntu24.04设置开机自启动Eureka

ubuntu24.04设置开机自启动Eureka 之前我们是在/root/.bashrc的文件中增加了一条命令 nohup java -jar /usr/software/eurekaServer-auth-prd-03.jar > /usr/software/log.log 2>&1 &但上面这条命令只有在登录root的用户时&#xff0c;才会执行&#xff0c;如果…...

从视频帧生成点云数据、使用PointNet++模型提取特征,并将特征保存下来的完整实现。

文件地址 https://github.com/yanx27/Pointnet_Pointnet2_pytorch?spm5176.28103460.0.0.21a95d27ollfze Pointnet_Pointnet2_pytorch\log\classification\pointnet2_ssg_wo_normals文件夹改名为Pointnet_Pointnet2_pytorch\log\classification\pointnet2_cls_ssg "E:…...

工化企业内部能源能耗过大 落实能源管理

一、精准监测与数据分析 实时准确的数据采集 企业能耗管理系统能够对企业内各种能源&#xff08;如电、水、气、热等&#xff09;的使用情况进行实时监测。通过安装在能源供应线路和设备上的智能传感器&#xff0c;可以精确地采集能源消耗的各项数据&#xff0c;包括瞬时流量、…...

LSTM 和 LSTMCell

1. LSTM 和 LSTMCell 的简介 LSTM (Long Short-Term Memory): 一种特殊的 RNN&#xff08;循环神经网络&#xff09;&#xff0c;用于解决普通 RNN 中 梯度消失 或 梯度爆炸 的问题。能够捕获 长期依赖关系&#xff0c;适合处理序列数据&#xff08;如自然语言、时间序列等&…...

python成长技能之正则表达式

文章目录 一、认识正则表达式二、使用正则表达式匹配单一字符三、正则表达式之重复出现数量匹配四、使用正则表达式匹配字符集五、正则表达式之边界匹配六、正则表达式之组七、正则表达式之贪婪与非贪婪 一、认识正则表达式 什么是正则表达式 正则表达式&#xff08;英语&…...

解决docker报Error response from daemon Get httpsregistry-1.docker.iov2错误

解决docker报Error response from daemon: Get "https://registry-1.docker.io/v2/"错误 报错详情 首先先看一下问题报错效果,我想要拉去nacos-serve&#xff1a;1.1.4的镜像&#xff0c;报如下错误&#xff0c;从报错信息可以看到&#xff0c;用于网络的愿意&…...

【论文分享】利用多源大数据衡量街道步行环境的老年友好性:以中国上海为例

本次给大家带来一篇SCI论文的全文翻译&#xff01;该论文考虑了绿化程度、可步行性、安全性、形象性、封闭性和复杂性这六个指标&#xff0c;提出了一种基于多源地理空间大数据的新型定量评价模型&#xff0c;用于从老年人和专家的角度评估街道步行环境的老年友好程度&#xff…...

说说软件工程中的“协程”

在软件工程中&#xff0c;协程&#xff08;coroutine&#xff09;是一种程序运行的方式&#xff0c;可以理解成“协作的线程”或“协作的函数”。以下是对协程的详细解释&#xff1a; 一、协程的基本概念 定义&#xff1a;协程是一组序列化的子过程&#xff0c;用户能像指挥家…...

使用IDE实现java端远程调试功能

使用IDE实现java端远程调试功能 1. 整体描述2. 前期准备3. 具体操作3.1 修改启动命令3.2 IDE配置3.3 打断点3.4 运行Debug 4. 总结 1. 整体描述 在做项目时&#xff0c;有些时候&#xff0c;需要和第三方进行调式&#xff0c;但是第三方不在一起&#xff0c;需要进行远程调试&…...

javaScript交互案例2

1、京东侧边导航条 需求&#xff1a; 原先侧边栏是绝对定位当页面滚动到一定位置&#xff0c;侧边栏改为固定定位页面继续滚动&#xff0c;会让返回顶部显示出来 思路&#xff1a; 需要用到页面滚动事件scroll&#xff0c;因为是页面滚动&#xff0c;所以事件源是document滚动…...

JavaScript 浏览器对象模型 BOM

浏览器对象模型&#xff08;Browser Object Model&#xff0c;BOM&#xff09;是指一组与浏览器进行交互的 JavaScript 对象。它允许 JavaScript 与浏览器的组件进行交互&#xff0c;比如窗口、文档、历史记录等。BOM 不同于 DOM&#xff08;文档对象模型&#xff09;&#xff…...

基于MATLAB的激光雷达与相机联合标定原理及实现方法——以标定板为例

1.为什么要进行激光雷达和相机的联合标定&#xff1f; 激光雷达和相机的联合标定是为了将两种传感器的数据统一到同一坐标系中&#xff0c;从而实现更准确的环境感知。激光雷达提供精准的三维距离信息&#xff0c;而相机捕捉丰富的纹理和颜色&#xff0c;通过联合标定可以结合两…...

如何解决Windows系统C盘空间不足问题:Windows Cleaner全面使用指南

如何解决Windows系统C盘空间不足问题&#xff1a;Windows Cleaner全面使用指南 【免费下载链接】WindowsCleaner Windows Cleaner——专治C盘爆红及各种不服&#xff01; 项目地址: https://gitcode.com/gh_mirrors/wi/WindowsCleaner 当你的Windows系统C盘不断变红、电…...

2026年做带货视频,以下8款混剪搬运软件值得推荐

好物带货视频二剪&#xff0c;优先选剪映&#xff08;手机/电脑全能免费&#xff09;、二剪助手&#xff08;AI批量消重&#xff09;、闪剪&#xff08;团队批量&#xff09;、极睿iCut&#xff08;直播切片&#xff09;&#xff0c;覆盖新手、批量、直播、专业全场景。 一、手…...

brpc动态负载均衡:基于实时性能数据的智能调度终极指南

brpc动态负载均衡&#xff1a;基于实时性能数据的智能调度终极指南 【免费下载链接】brpc brpc is an Industrial-grade RPC framework using C Language, which is often used in high performance system such as Search, Storage, Machine learning, Advertisement, Recomme…...

TQM系统功能拆解:如何用TQM解决生产流程中的质量波动难题

在现代制造业中&#xff0c;TQM系统已成为企业应对复杂生产流程、根治质量波动这一核心难题的数字化利器。传统的“事后检验”模式往往滞后且被动&#xff0c;无法有效遏制生产流程中因人员、设备或物料差异引发的质量波动&#xff0c;而引入成熟的TQM系统&#xff0c;则能通过…...

C/C++ 高性能网络编程终极奥义:epoll 边沿模式(ET) + 非阻塞 IO 架构全解

如果你拆开 Nginx、Redis 这些能支撑千万级并发的顶级开源软件的底层代码,你会发现它们的核心网络通信架构几乎如出一辙:epoll 边沿模式 (ET) + 非阻塞 IO + 事件状态机。 在上一堂课中,我们明确了一个致命问题:在 epoll 的边沿模式 (ET) 下,状态变化只通知一次。为了不漏…...

Docker 离线部署 Nginx 全流程实战指南

1. 环境准备&#xff1a;打造离线部署的基础设施 离线部署的第一步就是准备好所有必需的软件包和工具。想象一下你要去一个没有信号的荒岛露营&#xff0c;得提前打包好所有生存装备。这里我们的"生存装备"就是Docker运行环境和Nginx镜像。 我建议在开始前先检查服务…...

3步解决方案:ncmdump实现NCM音乐格式转换与跨平台播放自由

3步解决方案&#xff1a;ncmdump实现NCM音乐格式转换与跨平台播放自由 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 你是否遇到过网易云音乐下载的NCM文件无法在车载音响、专业音频软件或其他播放器中使用的困扰&#xff1f;ncmdu…...

RSL10 dongle 驱动识别不到

RSL10 USB Dongle(PN: RSL10-USB001GEVK ) 可作为central 设备对peripheral 设备进行确认与诊断也可在开发E7160sl presuite产品作为无线验配编程器使用。 有客户反馈在使用RSL10 USB Dongle作为无线验配编程器时,无法搜索到设备。...

中文语音转文字实战:Speech Seaco Paraformer从入门到精通

中文语音转文字实战&#xff1a;Speech Seaco Paraformer从入门到精通 1. 语音识别技术概述 语音识别&#xff08;Automatic Speech Recognition&#xff0c;ASR&#xff09;技术已经发展了几十年&#xff0c;从最初的孤立词识别到现在的连续语音识别&#xff0c;技术不断进步…...

Qwen3-32B-Chat实战案例:为内容平台搭建AI审核+自动标签+SEO标题生成流水线

Qwen3-32B-Chat实战案例&#xff1a;为内容平台搭建AI审核自动标签SEO标题生成流水线 1. 项目背景与需求分析 内容平台每天面临海量用户生成内容(UGC)的管理挑战。传统人工审核方式存在效率低、成本高、标准不统一等问题。同时&#xff0c;内容标签分类和SEO标题优化也需要大…...