索引下推:

ICP过滤的条件可以不限于用于索引查找(index lookup)的字段。只要存储引擎在扫描当前索引时能够访问到该字段的值,就可以用它来过滤。

索引可以分为聚簇索引和非聚簇索引

没有索引下推:

当使用聚簇索引的时候,b+树的叶子结点就是数据项,但是如果没有索引下推的话,即使数据中已经可以拿到其余的数据项,但是仍然不会进行过滤

例如where name = 张% and age < 30,只在name上有聚簇索引

即使在存储引擎根据name查询得到的数据是完整的数据,可以拿到age字段的值,但是仍然不会对age条件进行过滤

使用非聚簇索引的时候,b+树的叶子结点是主键索引的值,例如一个联合索引(a,b,c),如果只匹配到a,那么即使where条件中有c的条件,也不会在这个时候进行过滤,只会根据a的索引得到所有主键id,然后返回给服务器,服务器再根据主键id去查询所有数据,返回到服务层再进行过滤,这个过程就是回表

有索引下推:

会将where的条件下推到存储引擎层,存储引擎层就会利用自己所能获得的数据更多的进行过滤

同样上面两个例子:

如果是聚簇索引的话,存储引擎可以得到完整的数据,就可以在这个时候根据age字段进行过滤,将过滤之后的数据返回给服务器层

如果是非聚簇索引的话,在联合索引(a,b,c)中虽然只匹配到a的索引,但是可以获得c字段的值,也可以通过where中c的值进行过滤,返回更少的主键id给服务器层去进行回表

索引失效:

就是明明可以使用索引来提升效率但是没用上索引

1.索引类型不匹配

例如索引age的数据类型是整数类型,但是查询的时候使用的是age = '20'

这样就会导致隐式类型转换,导致无法使用age上的索引

2.使用函数表达式

age上有索引,但是使用的是where f(age) = 30,索引无法生效

3.进行运算

age有索引,但是where age + 20 < 30,这样的运算实际也会导致索引失效

虽然后面mysql优化可以给带运算的字段加索引,但是不是一定生效的

4.like查询且以通配符(如 %_)开头时

name上有索引,但是like '%张'会导致name上的索引失效,但是like '张%'可以用上索引

5.or条件

or两侧是同一个索引:索引生效

or两侧是多个索引:优化器通常会评估索引之间的效率,选择其中一个索引使用或者全表搜索,如果有索引合并的话,会分别将索引查找的集合进行union合并

6.not in和not like

NOT IN 的否定性质使其难以利用索引的有序性进行快速定位(B+树的优势在于快速找到“等于”或“在某个范围内”的值),但它仍然可以利用索引进行扫描,但是不是利用索引查询

not in的时候如果范围内有null的话,会导致查不到数据

7.在联合索引中,如果前导索引是范围查询,后续索引不会生效

比如联合索引(a,b),如果是where a>10 and b = 20;只会匹配到索引a,索引b不会生效

对not in的改进:

例如:

  • 表 users:有 10000 个用户,id 是主键(有索引)。
  • 表 banned_users:有 10 个被封禁的用户,user_id 列有索引

1.使用not in

SELECT * FROM users 
WHERE id NOT IN (SELECT user_id FROM banned_users);

如果banned_users中存在一条user_id为null的记录的话,那这条查询就会出问题,查不到任何数据

2.使用not exists

SELECT * FROM users u
WHERE NOT EXISTS (SELECT 1 FROM banned_users b WHERE b.user_id = u.id
);

实际上对user表也是全表检索的,但是如果banned_users的user_id有索引的话可以用上这个的索引

3.使用left join

SELECT u.*
FROM users u
LEFT JOIN banned_users b ON u.id = b.user_id
WHERE b.user_id IS NULL;

左连接以左边的表为主,把右边的表按照u.id=b.user_id拼过来,如果不存在b.user_id的话,就是null

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

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

相关文章

【电赛学习笔记】MaixCAM 的OCR图片文字识别

前言 本文是对MaixPy官方文档 MaixCAM MaixPy 实现 OCR 图片文字识别 - MaixPy 的项目实践整理与拓展&#xff0c;侵权即删。 功能介绍 OCR是MaixCAM中功能强大的数字文字识别模块&#xff0c;可以做到轻松的识别各种数字与文字。 OCR官方例程解析 工程源码 from maix im…

如何在生成式引擎优化(GEO)中取得成功

如果你希望您的内容出现在 AI Overviews、ChatGPT 和 Gemini 中&#xff1f;以下是设置 GEO 广告系列的方法。 任何好的 GEO 活动的第一步是创造一些东西实际上想要链接到或引用。 GEO 策略组件 想象一些你合理预期不会直接在 ChatGPT 或类似系统中找到的体验&#xff1a; 例如…

WPFC#超市管理系统(3)商品管理

超市管理系统6. 商品管理6.1 添加商品6.1 商品管理主界面6.3 修改商品6. 商品管理 将前文中的GoodsView全部改成和数据库一致的ProductView新增枚举类型商品类型ProductType.cs namespace 超市管理系统.Enums {public enum ProductType{水果类,休闲食品类,粮油类,饮料类,日用…

openwrt中br-lan,eth0,eth0.1,eth0.2

CPU是QCA9558 有两个以太网接口 这个好像没有外接交换机直接印出来的 openwrt中br-lan,eth0,eth0.1,eth0.2 https://blog.csdn.net/f2157120/article/details/119460852 这个哥用的是 链接: DomyWifi DW33D 路由器 CPU是QCA9558 有两个以太网接口 因为CPU没集成千兆交换&…

RAG实战指南 Day 29:RAG系统成本控制与规模化

【RAG实战指南 Day 29】RAG系统成本控制与规模化 开篇 欢迎来到"RAG实战指南"系列的第29天&#xff01;今天我们将深入探讨RAG系统的成本控制与规模化部署策略。当RAG系统从原型阶段进入生产环境时&#xff0c;如何经济高效地扩展系统规模、控制运营成本成为关键挑…

React 中获取当前路由信息

在 React 中获取当前路由信息&#xff0c;根据使用的路由库不同&#xff08;如 React Router v5/v6 或 Next.js&#xff09;&#xff0c;方法也有所区别。以下是常见场景的解决方案&#xff1a;1. 使用 React Router v6 获取当前路径&#xff08;pathname&#xff09;、查询参数…

Sklearn 机器学习 随机森林 网格搜索获取最优参数

💖亲爱的技术爱好者们,热烈欢迎来到 Kant2048 的博客!我是 Thomas Kant,很开心能在CSDN上与你们相遇~💖 本博客的精华专栏: 【自动化测试】 【测试经验】 【人工智能】 【Python】 Sklearn 机器学习:随机森林 + 网格搜索获取最优参数实战指南 在构建机器学习模型时,…

力扣-101.对称二叉树

题目链接 101.对称二叉树 class Solution {public boolean check(TreeNode l, TreeNode r) {if (l null && r null)return true;if ((l null && r ! null) || (r null && l ! null))return false;if (l.val ! r.val)return false;return check(l…

从句--02-1--done,doing ,prep 做定语

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录定语1.done&#xff08;过去分词&#xff09;做定语一、过去分词作定语的位置二、过去分词作定语的语义特点三、过去分词作定语与现在分词作定语的区别四、过去分词作…

JVM全面解析

摘要&#xff1a;JVM是Java程序运行的核心环境&#xff0c;负责解释执行字节码并管理内存。其核心功能包括类加载与验证、字节码执行优化、内存管理与垃圾回收&#xff08;GC&#xff09;、跨平台支持及安全性保障。JVM架构包含程序计数器、虚拟机栈、本地方法栈、堆和方法区等…

SDC命令详解:使用write_script命令进行输出

相关阅读 SDC输出命令https://blog.csdn.net/weixin_45791458/category_12993272.html?spm1001.2014.3001.5482 write_script命令用于将设计中的属性设置命令输出为脚本文件&#xff08;其实它并不是一个SDC命令&#xff0c;归为此类只是为了方便管理&#xff09;&#xff0c…

‌CASE WHEN THEN ELSE END‌

‌CASE WHEN THEN ELSE END‌ 是SQL中实现条件逻辑的核心表达式&#xff0c;支持单字段匹配和多条件判断&#xff0c;适用于数据处理、分类统计等场景。‌基本语法形式‌SQL中CASE表达式有两种标准形式&#xff1a;1‌ 简单CASE表达式‌&#xff08;字段直接匹配&#xff09;C…

飞单诱因:管理漏洞与人性交织

飞单看似是 “员工个人行为”&#xff0c;实则是餐厅管理、激励机制、外部环境等多重因素共同作用的结果。要根治飞单&#xff0c;需先理清背后的 “动力源”—— 员工为何选择冒险&#xff1f;一、“收入失衡”&#xff1a;薪资与付出不匹配的 “补偿心理”基层员工&#xff0…

工作笔记-----FreeRTOS中的lwIP网络任务为什么会让出CPU

工作笔记-----FreeRTOS中的lwIP网络任务为什么会让出CPU Author: 明月清了个风Date&#xff1a; 2025.7.30Ps:最近接触了在FreeRTOS中使用lwIP实现的网络任务&#xff0c;但是在看项目代码的过程中出现了一些疑问——网络任务的优先级为所有任务中最高的&#xff0c;并且任务框…

在 CentOS 系统上安装 Docker

在 CentOS 系统上安装 Docker&#xff0c;可按以下步骤操作&#xff1a;一、卸载旧版本&#xff08;如存在&#xff09;bashsudo yum remove docker \docker-client \docker-client-latest \docker-common \docker-latest \docker-latest-logrotate \docker-logrotate \docker-…

【CVPR2025】FlowRAM:用区域感知与流匹配加速高精度机器人操作策略学习

文章目录FlowRAM&#xff1a;用区域感知与流匹配加速高精度机器人操作策略学习一、问题出在哪里&#xff1f;方法部分&#xff1a;从结构到机制&#xff0c;详解 FlowRAM 的内部设计逻辑1. 动态半径调度器&#xff1a;自适应注意力机制在 3D 感知中的实现2. 多模态编码器与序列…

图片查重从设计到实现(5)Milvus可视化工具

要通过网页&#xff08;Web&#xff09;访问和管理 Milvus 向量数据库&#xff0c;可以使用官方提供的 Milvus Web UI 工具&#xff0c;这是一款可视化管理界面&#xff0c;支持查看集合、向量数据、执行基本操作等功能。以下是具体的部署和访问方法&#xff1a; 一、部署 Milv…

Linux-awk与sed

文章目录一、AWK1. awk 是什么&#xff1f;2. awk 的基础语法2.1 选项2.2 模式2.3 动作3. awk 的内置变量4. 典型应用场景及示例4.1 打印特定列4.2 条件筛选4.3 使用正则表达式4.4 统计行数4.5 字段操作4.6 使用内置函数4.7 多文件处理4.8 使用自定义变量5. 高级应用&#xff1…

文件加密工具(勒索病毒加密方式)

语言&#xff1a;C# WPF功能&#xff1a;文件加/解密本程序不提供下载&#xff0c;该程序新手操作不当&#xff0c;可能会导致文件加密后无法解密问题&#xff0c;解密需要独立私钥private.key文件支持&#xff0c;没有私钥加密文件是无法被解密的。更新&#xff1a;2025年7月3…

IOC实现原理源码解析

Spring三级缓存流程图singletonObjects&#xff08;一级缓存&#xff09;&#xff1a;缓存经过了完整生命周期的Bean&#xff1b;arlySingletonobjects&#xff08;二级缓存&#xff09;&#xff1a;缓存未经过完整生命周期的Bean&#xff0c;如果某个Bean出现了循环依赖&#…