【MySQL】前缀索引、索引下推、访问方法,自适应哈希索引

最左前缀原则

  • 对于INDEX(name, age)来说
  • 最左前缀可以是联合索引最左N个字段, 也可以是字符串索引最左M个字符
 SELECT * FROM t WHERE name LIKE '张%'
  • 其效果和单独创建一个INDEX(name)的效果是一样的
  • 若通过调整索引字段的顺序, 可以少维护一个索引树, 那么这个顺序就是需要优先考虑采用
  • 字符串创建索引,要考虑如果字符串很长的情况下,那么维护和响应成本也会很高,这时,可以使用字符串最左边开始部分字符建立索引
  • 索引的选择性指的是 : 不重复的索引值和数据表的记录总数(#T)的比值, 范围为 1/#T 到 1 之间, 索引选择性查询效率

索引选择性 = 不重复值的数量 / 总记录数,它反映了“这个索引字段能不能把数据查得很精”。

如果一个字段有 10 万条记录,但只有 3 个不同的值(比如性别:男、女,武装直升机),选择性 = 3 / 100000 = 0.00003 → 很低,不推荐建立单独索引。

如果字段有 10 万条记录,几乎每条都不同(比如身份证号),选择性接近 1 → 非常高,适合做索引。

  • 为什么选择性越高,查询越快?
    • 因为选择性越高,能过滤掉的数据就越多,减少回表,查询效率就越高。
  • 对于BLOB, TEXT, VARCHAR等类型的列, 必须使用前缀索引, MySQL不允许索引这些列的完整长度
  • MySQL 不允许直接为这类大字段建完整索引(因为太大了)。所以要建前缀索引,也就是只索引字段前 N 个字符

如何选 N(前缀长度)?

  1. 先看整列的区分度(理想情况):

    SELECT COUNT(DISTINCT name)/COUNT(*) FROM t;
    
  2. 再试试不同前缀长度的选择性,比如前 3、5、10 个字符:

    SELECT COUNT(DISTINCT LEFT(name, 3))/COUNT(*) FROM t;
    SELECT COUNT(DISTINCT LEFT(name, 5))/COUNT(*) FROM t;
    ...
    
  3. 看哪个N更靠近1, 进行索引的创建,用它来建索引:

    CREATE INDEX idx_name_prefix ON t(name(N));
    
-- 查看详细索引信息
show index from products;

什么是“索引下推”?

索引下推是 MySQL 从 5.6 开始引入的一种优化技术,它让更多的WHERE 条件在索引扫描阶段就被处理掉,减少了回表次数,从而提升查询效率。


举个例子说明:

SQL语句如下:

SELECT * FROM t WHERE name LIKE '陈%' AND age = 10;
-- 假设我们创建了联合索引:INDEX(name, age)

在 MySQL 5.6 之前(没有索引下推):

  1. 使用索引找出 name LIKE '陈%' 匹配的主键 id
  2. 对这些 id 一条条回表(到原始数据)
  3. 然后在回表的数据中判断 age = 10

问题:大量回表,浪费IO。


MySQL 5.6 之后(有索引下推 ICP):

  1. 先用索引查出 name LIKE '陈%'
  2. 在索引中继续判断 age = 10(因为索引中也有 age 字段)。
  3. 只有两个条件都满足,才回表拿全部字段。

优势:回表次数少,速度快。


对比图解(简化描述):

[无 ICP]       name → (回表) → 判断 age → 符合 → 返回结果
[有 ICP]       name → 判断 age (在索引内完成) → (回表) → 返回结果

使用条件:

  • 使用了联合索引(如 INDEX(name, age))。
  • 查询中涉及多个字段条件。
  • 被筛选的多个字段都在索引中存在

想验证是否用了索引下推?

你可以使用 EXPLAINEXPLAIN FORMAT=JSON

EXPLAIN SELECT name, age FROM t WHERE name LIKE '陈%' AND age = 10;

查看 Extra 中是否出现:

Using index condition

就说明用了索引下推。

索引下推使用条件逐条理解

条件含义解释是否关键原因与说明
✅ 只能用于 rangerefeq_refref_or_null 访问方法ICP 只在索引访问的情况下生效,这几种是索引访问方式中常见的全表扫描 (ALL) 不会使用索引,自然也就无索引下推
✅ 只能用于 InnoDB 和 MyISAM 引擎(含分区表)目前 ICP 仅支持这两个存储引擎其他引擎如 MEMORY、CSV 不支持该特性
✅ 对 InnoDB 来说,ICP 只作用于 二级索引(辅助索引)InnoDB 的主键是聚簇索引,数据和索引一体聚簇索引查询不需要回表,因此没有回表优化的必要
✅ ICP 的目的就是减少回表次数(减少 IO)回表代价高,所以想办法让更多的过滤发生在索引层回表越少,磁盘 IO 越少,性能越高
❌ 子查询中的条件不能下推ICP 只作用于主查询中的 WHERE 条件子查询优化路径不同,不能在索引层提前判断
❌ 使用存储函数(如 IFNULL(col, ''))的条件不能下推存储引擎无法理解和执行存储函数ICP 是存储引擎层做的过滤,函数是 SQL 层的,隔离了

什么是这些“访问方法”?(range、ref、eq_ref、ref_or_null)

这些是 MySQL 优化器 在执行 SELECT 时使用的 索引访问方式,用来决定“怎么查你这张表”。

你可以用 EXPLAIN 看见,比如:

EXPLAIN SELECT * FROM users WHERE id = 1;

type 那一列就可能会出现:refrangeALL 等。


访问方法中文意思举例是否能用 ICP说明
range范围查找id > 5 AND id < 10✅ 支持利用索引范围扫描(B+ 树区间)
ref普通等值查找name = '张三'name 有索引✅ 支持单值等值匹配,常见联合索引匹配场景
eq_ref唯一等值查找t1.id = t2.id 且 t2.id 是主键或唯一索引✅ 支持用于连接,精确匹配唯一值
ref_or_null等值 + null 查找name = '张三' OR name IS NULL✅ 支持对空值的处理也是索引可识别的
ALL全表扫描没有用索引❌ 不支持没有用到索引,自然谈不上索引下推
  • 尝试时的一个问题
create index idx_product_name_and_category_union on products(product_name, category);
show index from products;
-- 这里没触发索引下推,LIKE '笔%' 是可以使用索引的(前缀匹配),
-- 但匹配度低,MySQL 可能选择不下推 category 的判断,保留到回表阶段处理。
explain select product_id from products where product_name like '笔%' and category = 'Electronics';-- 加上 FORCE INDEX 强制使用联合索引,后就使用索引下推了
EXPLAIN SELECT * FROM products FORCE INDEX(idx_product_name_and_category_union)
WHERE product_name LIKE '笔%' AND category = 'Electronics';

在这里插入图片描述


自适应哈希索引

InnoDB 支持一种 自适应哈希索引(AHI) 的优化机制,它不是我们手动建的索引,而是 InnoDB 在运行过程中自动创建的哈希索引

  • 目的是加快查询速度,特别是对频繁访问的相同范围或相同条件的 B+树索引查询,会自动转化为哈希结构,提升效率。

具体来说:

  • InnoDB 会监控 B+ 树索引的使用频率
  • 如果发现某段范围经常被查询,而且是“等值查找”(不是模糊、范围),就会自动为这段建立哈希索引
  • 这样后续的查找可以从 O(log n) 变为 O(1),提升性能
  • 它是完全自动、由 InnoDB 维护的,不需要我们手动干预

内容
使用场景频繁的等值查询,例如 WHERE id = 123,会被自动转换为哈希索引优化
控制开关参数:innodb_adaptive_hash_index=ON(默认开启)
内存占用哈希索引是存在 Buffer Pool 的内存中,不是磁盘上的
限制只能用于等值匹配,不支持范围查询或模糊匹配(LIKE、BETWEEN 等)
风险对热点表、高并发写可能带来锁冲突,可考虑关闭该功能

https://github.com/0voice

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

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

相关文章

【Oracle专栏】Oracle中的虚拟列

Oracle相关文档&#xff0c;希望互相学习&#xff0c;共同进步 风123456789&#xff5e;-CSDN博客 1.背景 在EXP方式导出时&#xff0c;发现 出现如下提示 EXP-00107: virtual column 不支持&#xff0c;因此采用expdp方式导出。于是本文针对oracle虚拟列进行简单介绍。 2. 相…

Nacos深度剖析与实践应用之-配置中心

&#x1f4f9; 简介 在微服务架构中&#xff0c;配置管理是至关重要的基础能力。Nacos作为阿里巴巴开源的一体化动态服务发现、配置管理和服务管理平台&#xff0c;其配置中心模块提供了统一配置管理、动态配置推送、多环境支持等核心能力。相比传统配置文件方式&#xff0c;Na…

gma 2.1.4 (2025.04.18) | GmaGIS V0.0.1a3 更新日志

安装 gma 2.1.4 pip install gma2.1.4网盘下载&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1P0nmZUPMJaPEmYgixoL2QQ?pwd1pc8 提取码&#xff1a;1pc8 注意&#xff1a;此版本没有Linux版&#xff01; 编译gma的Linux虚拟机没有时间修复&#xff0c;本期Linux版继…

在 Node.js 中设置响应的 MIME 类型

在 Node.js 中设置响应的 MIME 类型是为了让浏览器正确解析服务器返回的内容&#xff0c;比如 HTML、CSS、图片、JSON 等。我们通常通过设置响应头中的 Content-Type 字段来完成。 ✅ 一、什么是 MIME 类型&#xff08;Content-Type&#xff09;&#xff1f; MIME&#xff08;…

SRS transcode支持 h264_nvenc 硬件解码方案

文章目录 SRS transcode支持 h264_nvenc 硬件解码方案1、修改文件2、重新编译3、使用 SRS transcode支持 h264_nvenc 硬件解码方案 SRS 是开源的流媒体服务&#xff0c;但在使用 GPU 服务器时&#xff0c;想要通过硬件加速&#xff0c;目前官方是不支持的&#xff0c;所以简单…

数字系统与编码

1. 数字系统&#xff08;Number Systems&#xff09; 1.1 常见数字系统 系统基数符号集示例应用场景二进制20, 11010计算机底层电路、数据存储八进制80-717Unix文件权限&#xff08;如chmod 755&#xff09;十进制100-942日常计算十六进制160-9, A-F0x1F内存地址、颜色编码&a…

【PyTorch】训练时跟OOM相关的提示信息

1. RuntimeError: CUDA error: CUBLAS_STATUS_NOT_INITIALIZED when calling cublasCreate(handle)

基于maven-jar-plugin打造一款自动识别主类的maven打包插件

&#x1f9d1; 博主简介&#xff1a;CSDN博客专家&#xff0c;历代文学网&#xff08;PC端可以访问&#xff1a;https://literature.sinhy.com/#/?__c1000&#xff0c;移动端可微信小程序搜索“历代文学”&#xff09;总架构师&#xff0c;15年工作经验&#xff0c;精通Java编…

多态的主要好处与不足

多态是面向对象编程的核心特性之一&#xff0c;它通过方法重写、接口实现等方式实现“同一操作作用于不同对象时产生不同行为”。以下是多态的主要好处与不足&#xff1a; 多态的好处 1. 提高代码灵活性和扩展性 开闭原则支持&#xff1a;新增子类时&#xff0c;无需修改现有…

excel解析图片pdf附件不怕

背景 工作中肯定会有导入excel还附带图片附件的下面是我解析的excel&#xff0c;支持图片、pdf、压缩文件实现 依次去解析excel&#xff0c;看看也没有附件&#xff0c;返回的格式是Map&#xff0c;key是第几行&#xff0c;value是附件list附件格式都被解析成pdf格式Reader.jav…

python爬虫 线程,进程,协程

0x00 线程 线程是一个执行单位&#xff0c;是在一个进程里面的&#xff0c;是共享进程里面的提供的内存等资源&#xff0c;使用多个线程时和使用多个进程相比&#xff0c;多个线程使用的内存等资源较少。进程像一座“房子”&#xff08;独立资源&#xff09;&#xff0c;线程是…

ES|QL,知道吗,专为搜索而生 —— 推出评分和语义搜索

作者&#xff1a;来自 Elastic Ioana Tagirta 在 Elasticsearch 8.18 和 9.0 中&#xff0c;ES|QL 支持评分、语义搜索以及更多的 match 函数配置选项&#xff0c;还有一个新的 KQL 函数。 使用 ES|QL 搜索 在 Elasticsearch 8.18 和 9.0 中&#xff0c;ES|QL 增加了一系列新功…

MIT6.S081-lab4

MIT6.S081-lab4 注&#xff1a;本篇lab的前置知识在《MIT6.S081-lab3前置》 1. RISC-V assembly 第一个问题 Which registers contain arguments to functions? For example, which register holds 13 in main’s call to printf? 我们先来看看main干了什么&#xff1a; …

一文总结通信电路中LC谐振回路中各公式以及对深入解读品质因数Q

目录 前言 一、基本公式总结 1.并联谐振回路 2.串联谐振回路 二、浅谈品质因数 1.衡量谐振回路能量存储与能量损耗之比的无量纲参数&#xff0c;用于描述谐振电路的频率选择性 2.当受到振荡驱动力时&#xff0c;谐振腔的中心频率与其带宽的比值 3.为什么谐振时电容上的…

Linux:文件系统

一.认识硬件–磁盘 1. 物理结构 1.2 存储结构 ❓如何定位⼀个扇区呢&#xff1f; 可以先定位磁头&#xff08;header&#xff09;——》确定磁头要访问哪⼀个柱⾯(磁道)&#xff08;cylinder&#xff09;——》 定位⼀个扇区(sector)。 柱⾯&#xff08;cylinder&#xff09…

数字孪生废气处理工艺流程

图扑数字孪生废气处理工艺流程系统。通过精准 3D 建模&#xff0c;对废气收集、预处理、净化、排放等全流程进行 1:1 数字化复刻&#xff0c;实时呈现设备运行参数、污染物浓度变化等关键数据。 借助图扑可视化界面&#xff0c;管理者可直观掌握废气处理各环节状态&#xff0c…

Scratch——第18课 列表接龙问题

在四级的考级中&#xff0c;接龙的题目虽然在CIE中只出现过两次&#xff0c;但是这类题目对字符串的知识点考察相对全面。 一、接龙游戏的判断方法 接龙的内容对应的字符数 ? 已接龙内容的字符数 满足条件>接龙内容的第一个字符数 ? 上一项接龙的最后一个字符 满足条件…

webgl入门实例-向量在图形学中的核心作用

在图形学中&#xff0c;向量是描述几何、光照、运动等核心概念的基础工具。以下是向量在图形学中的关键应用和深入解析&#xff1a; 1. 向量的核心作用 几何表示&#xff1a;描述点、方向、法线、切线等。空间变换&#xff1a;平移、旋转、缩放等操作依赖向量运算。光照计算&a…

Redis 是如何保证线程安全的?

Redis 是如何保证线程安全的&#xff1f; Redis 是一个高性能的键值数据库&#xff0c;广泛应用于缓存、消息队列、实时分析等场景。由于其性能优势&#xff0c;Redis 已经成为许多系统的核心组件之一。然而&#xff0c;很多开发者在使用 Redis 时&#xff0c;常常会问&#x…

Img2img-turbo 在2080Ti上的测试笔记

1. 介绍 [img2img-turbo]是[pytorch-CycleGAN-and-pix2pix]推荐的更新的图像变换的代码实现&#xff1b; 2. 配置信息 Conda环境名称&#xff1a;img2img-turbo 3. 问题描述 当前在我们尝试使用了官方推荐的训练命令在2080Ti上进行训练&#xff0c; 3.1 出现了 CUDA out …