【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(前缀长度)?
-
先看整列的区分度(理想情况):
SELECT COUNT(DISTINCT name)/COUNT(*) FROM t; -
再试试不同前缀长度的选择性,比如前 3、5、10 个字符:
SELECT COUNT(DISTINCT LEFT(name, 3))/COUNT(*) FROM t; SELECT COUNT(DISTINCT LEFT(name, 5))/COUNT(*) FROM t; ... -
看哪个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 之前(没有索引下推):
- 使用索引找出
name LIKE '陈%'匹配的主键 id。 - 对这些 id 一条条回表(到原始数据)。
- 然后在回表的数据中判断
age = 10。
问题:大量回表,浪费IO。
MySQL 5.6 之后(有索引下推 ICP):
- 先用索引查出
name LIKE '陈%'。 - 再在索引中继续判断
age = 10(因为索引中也有age字段)。 - 只有两个条件都满足,才回表拿全部字段。
优势:回表次数少,速度快。
对比图解(简化描述):
[无 ICP] name → (回表) → 判断 age → 符合 → 返回结果
[有 ICP] name → 判断 age (在索引内完成) → (回表) → 返回结果
使用条件:
- 使用了联合索引(如
INDEX(name, age))。 - 查询中涉及多个字段条件。
- 被筛选的多个字段都在索引中存在。
想验证是否用了索引下推?
你可以使用 EXPLAIN 或 EXPLAIN FORMAT=JSON:
EXPLAIN SELECT name, age FROM t WHERE name LIKE '陈%' AND age = 10;
查看 Extra 中是否出现:
Using index condition
就说明用了索引下推。
索引下推使用条件逐条理解
| 条件 | 含义解释 | 是否关键 | 原因与说明 |
|---|---|---|---|
✅ 只能用于 range、ref、eq_ref、ref_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 那一列就可能会出现:ref、range、ALL 等。
| 访问方法 | 中文意思 | 举例 | 是否能用 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
相关文章:
【MySQL】前缀索引、索引下推、访问方法,自适应哈希索引
最左前缀原则 对于INDEX(name, age)来说最左前缀可以是联合索引的最左N个字段, 也可以是字符串索引的最左M个字符。 SELECT * FROM t WHERE name LIKE 张%其效果和单独创建一个INDEX(name)的效果是一样的若通过调整索引字段的顺序, 可以少维护一个索引树, 那么这个顺序就是需要…...
C++中变量、函数存储、包括虚函数多态实现机制说明
从C语言转到C开发,对于类内变量的存储,类内函数的存储,存在疑惑; 子类如何继承父类的变量的?如果子类和父类变量同名了怎么办?C中,函数有了作用域,类内函数,只能是这个类或对应对…...
Android Studio开发知识:从基础到进阶
引言 Android开发作为移动应用开发的主流方向之一,曾吸引了无数开发者投身其中。然而,随着市场饱和和技术迭代,当前的Android开发就业形势并不乐观,竞争日益激烈。尽管如此,掌握扎实的开发技能仍然是脱颖而出的关键。本…...
数据加载与保存
通用方式 SparkSQL提供了通用的数据加载方式,使用spark.read.loa方法,并可通过format指定数据类型(如csv、jdbc、json、orc、parquet、textFile)。 load方法后需传入数据路径(针对csv、jdbc、json、orc、parquet、…...
linux命令九
系统服务 常见重点配置 Listen:监听地址:端口(80) ServerName:本站点注册的DNS名称(空缺) DocumentRoot:网页根目录(/var/www/html) DirectoryIndex:起始…...
ocr-身份证正反面识别
在阿里云官网,申请一个token [阿里官方]身份证OCR文字识别_API专区_云市场-阿里云 (aliyun.com) 观察一下post请求body部分json字符串,我们根据这个创建一个java对象 先默认是人像面 public class IdentityBody {public String image;class configure…...
PCIE Link Equalizaton
1. 均衡概述 link均衡是用于通过调整tx rx的参数来提高信号质量, 所有有LTSSM关联的lane都需要进行均衡操作。均衡只有在低速率的均衡完成之后才可以进行后续高速度的均衡,虽然协议规定可以重复做均衡,但是还是不建议进行同意速率的重复多次均…...
单节锂电池4.2V升压5V都有哪些国产芯片推荐?国产SL4011高效,高性价比
针对单节锂电池(4.2V)升压至5V应用中 SL4011升压芯片 的核心优势解析,结合其技术参数与典型应用场景进行详细说明: 1. 宽输入电压与高兼容性 输入范围:2.7V-12V,完美覆盖单节锂电池全周期电压(3…...
机器学习 | 神经网络介绍 | 概念向
文章目录 📚从生物神经元到人工神经元📚神经网络初识🐇激活函数——让神经元“动起来”🐇权重与偏置——调整信息的重要性🐇训练神经网络——学习的过程🐇过拟合与正则化——避免“死记硬背” 👀…...
视频孪生重构施工逻辑:智慧工地的数字化升级
当"智慧工地"概念在2017年首次写入《建筑业发展"十三五"规划》时,行业普遍将其等同于摄像头与传感器的简单叠加。十年数字浪潮冲刷下,智慧工地的内涵已发生本质跃迁:从工具层面的信息化改造,进化为基于视频数…...
六根觉性:穿透表象的清净觉知之光
在喧嚣的禅堂里,老禅师轻叩茶盏,清脆的声响划破沉寂。这声"叮"不仅震动耳膜,更叩击着修行者的心性——这正是佛教揭示的六根觉性在世间万相中的妙用。当我们凝视《楞严经》中二十五圆通法门,六根觉性犹如六道澄明之光&a…...
spring:注解@Component、@Controller、@Service、@Reponsitory
背景 spring框架的一个核心功能是IOC,就是将Bean初始化加载到容器中,Bean是如何加载到容器的,可以使用spring注解方式或者spring XML配置方式。 spring注解方式直接对项目中的类进行注解,减少了配置文件内容,更加便于…...
【树形dp题解】dfs的巧妙应用
【树形dp题解】dfs的巧妙应用 [P2986 USACO10MAR] Great Cow Gathering G - 洛谷 题目大意: Bessie 正在计划一年一度的奶牛大集会,来自全国各地的奶牛将来参加这一次集会。当然,她会选择最方便的地点来举办这次集会。 每个奶牛居住在 N N …...
Halcon应用:九点标定-手眼标定
提示:若没有查找的算子,可以评论区留言,会尽快更新 Halcon应用:九点标定-手眼标定 前言一、Halcon应用?二、应用实战1、图形理解[eye-to-hand]:1.1、开始应用2 图形理解[eye-in-hand] 前言 本篇博文主要用…...
【iOS】OC高级编程 iOS多线程与内存管理阅读笔记——自动引用计数(一)
自动引用计数 前言alloc/retain/release/dealloc实现苹果的实现 autoreleaseautorelease实现苹果的实现 总结 前言 此前,写过一遍对自动引用计数的简单学习,因此掠过其中相同的部分:引用计数初步学习 alloc/retain/release/dealloc实现 由于…...
Python爬虫第15节-2025今日头条街拍美图抓取实战
目录 一、项目背景与概述 二、环境准备与工具配置 2.1 开发环境要求 2.2 辅助工具配置 三、详细抓取流程解析 3.1 页面加载机制分析 3.2 关键请求识别技巧 3.3 参数规律深度分析 四、爬虫代码实现 五、实现关键 六、法律与道德规范 一、项目概述 在当今互联网时代&a…...
智慧城市像一张无形大网,如何紧密连接你我他?
智慧城市作为复杂巨系统,其核心在于通过技术创新构建无缝连接的网络,使物理空间与数字空间深度融合。这张"无形大网"由物联网感知层、城市数据中台、人工智能中枢、数字服务入口和安全信任机制五大支柱编织而成,正在重塑城市运行规…...
网络安全·第四天·扫描工具Nmap的运用
今天我们要介绍网络安全中常用的一种扫描工具Nmap,它被设计用来快速扫描大型网络,主要功能包括主机探测、端口扫描以及版本检测,小编将在下文详细介绍Nmap相应的命令。 Nmap的下载安装地址为:Nmap: the Network Mapper - Free Se…...
黑龙江 GPU 服务器租用:开启高效计算新征程
随着人工智能、深度学习、大数据分析等技术的广泛应用,对强大计算能力的需求日益迫切。GPU 服务器作为能够提供卓越并行计算能力的关键设备,在这一进程中发挥着至关重要的作用。对于黑龙江地区的企业、科研机构和开发者而言,选择合适的 GPU 服…...
大数据面试问答-HBase/ClickHouse
1. HBase 1.1 概念 HBase是构建在Hadoop HDFS之上的分布式NoSQL数据库,采用列式存储模型,支持海量数据的实时读写和随机访问。适用于高吞吐、低延迟的场景,如实时日志处理、在线交易等。 RowKey(行键) 定义…...
SparseDrive---论文阅读
纯视觉下的稀疏场景表示 算法动机&开创性思路 算法动机: 依赖于计算成本高昂的鸟瞰图(BEV)特征表示。预测和规划的设计过于直接,没有充分利用周围代理和自我车辆之间的高阶和双向交互。场景信息是在agent周围提取ÿ…...
数字时代的AI与大数据:用高级AI开发技术革新大数据管理
李升伟 编译 在当今数字时代,数据的爆炸式增长令人惊叹 从社交媒体互动到物联网设备的传感器数据,企业正被海量信息淹没。但如何将这种无序的数据洪流转化为有价值的洞察?答案在于人工智能(AI)开发技术的革新&#x…...
Unchained 内容全面上链,携手 Walrus 迈入去中心化媒体新时代
加密新闻媒体 Unchained — — 业内最受信赖的声音之一 — — 现已选择 Walrus 作为其去中心化存储解决方案,正式将其所有媒体内容(文章、播客和视频)上链存储。Walrus 将替代 Unchained 现有的中心化存储架构,接管其全部历史内容…...
确保连接器后壳高性能互连的完整性
本文探讨了现代后壳技术如何促进高性能互连的电气和机械完整性,以及在规范阶段需要考虑的一些关键因素。 当今的航空航天、国防和医疗应用要求连接器能够提供高速和紧凑的互连,能够承受振动和冲击,并保持对电磁和射频干扰 (EMI/R…...
C++学习Day0:c++简介
目录 一、.C语言的发展史二、C特点三、面向对象的重要术语四、面向过程和面向对象的区别?五、开发环境:六、创建文件步骤:1.点击新建项目2.在弹出的开始栏中按如下操作3.在.pro文件中添加(重要!!࿰…...
从零开始构建 Ollama + MCP 服务器
Model Context Protocol(模型上下文协议)在过去几个月里已经霸占了大家的视野,出现了许多酷炫的集成示例。我坚信它会成为一种标准,因为它正在定义工具与代理或软件与 AI 模型之间如何集成的新方式。 我决定尝试将 Ollama 中的一…...
【bash】.bashrc
查看当前路径文件数量 alias file_num"ls -l | grep ^- | wc -l"查看文件大小 alias file_size"du -sh"alias ll alias ll"ls -ltrh"cd的同时执行ll alias cdcdls; function cdls() {builtin cd "$1" && ll }自定义prompt…...
合成数据如何赋能大模型预训练:效果与效率的双重加速器
目录 合成数据如何赋能大模型预训练:效果与效率的双重加速器 一、预训练模型为何需要合成数据? ✅ 克服真实数据的稀缺与偏倚 ✅ 控制训练内容结构与分布 ✅ 提升学习效率与训练稳定性 二、哪些预训练任务适合用合成数据? 三、如何构建…...
java忽略浅拷贝导致bug
bug源代码 /*** 查询用户列表** param user 用户* param page 页* param size 大小* since 2025/04/14 11:53:25*/PostMapping("/getUser")public IWMSResponse<?> getUser(RequestBody SjUser user, RequestParam(defaultValue "1") Integer pag…...
MATLAB学习笔记(二) 控制工程会用到的
MATLAB中 控制工程会用到的 基础传递函数表达传递函数 零极点式 状态空间表达式 相互转化画响应图线根轨迹Nyquist图和bode图现控部分求约旦判能控能观极点配置和状态观测 基础 传递函数表达 % 拉普拉斯变换 syms t s a f exp(a*t) %e的a次方 l laplace(f) …...
