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

索引的选择与Change Buffer

1. 索引选择与Change Buffer

问题引出:普通索引 vs 唯一索引 ——如何选择?

在实际业务中,如果一个字段的值天然具有唯一性(如身份证号),并且业务代码已确保无重复写入,那就存在两种选择:

  • 创建唯一索引
  • 创建普通索引

虽然逻辑上两者都可以正确工作,但从 性能角度看,应该如何选择呢?

1.1. 查询场景下的性能差异

查询语句示例:

SELECT name FROM CUser WHERE id_card = 'xxxxxxxyyyyyyzzzzz';

查询过程分析:

  • InnoDB 使用 B+ 树索引,查找过程是按层遍历到叶子节点。
  • 普通索引

找到首个满足条件的记录后,还会继续查找,直到条件不再满足。

  • 唯一索引

找到首个满足条件的记录后立即停止。

性能差距分析:

  • InnoDB 是按数据页(默认16KB)为单位读取的。
  • 也就是说,命中一条记录时,整个数据页已在内存中
  • 普通索引多做一次判断和指针移动,性能开销极小,可以忽略不计。

结论:查询性能差异微乎其微

1.2. 更新场景下的性能差异 (关注 Change Buffer )

Change Buffer 的概念:

  • 又称 变更缓冲区,用于缓存针对尚未加载入内存的数据页的 DML 操作。
  • 目的是延迟磁盘读写,提升写性能。
  • 持久化存储,内存+磁盘双存储。

Merge 操作:

  • 当数据页被访问或系统后台线程定期触发时,change buffer 会被合并(merge)到实际数据页中。

两种索引对比:

特性

唯一索引

普通索引

查询性能差距

几乎无

几乎无

是否能使用 Change Buffer

❌ 不能使用

✅ 可以使用

写入磁盘前是否需加载数据页

✅ 是

❌ 否

写多读少场景优化空间

⛔️ 受限

✅ 提升明显

建议使用场景

严格校验唯一性

默认首选

  • 唯一索引需验证是否存在重复值,必须读入数据页判断唯一性,无法延迟IO。
  • 而普通索引可以直接缓存写操作,延迟数据页加载。

1.3. Change Buffer 的影响和适用场景

Change Buffer 的实际影响分析

1. 情况一:目标页在内存中

  • 唯一索引:读内存判断唯一性后插入,结束。
  • 普通索引:直接插入,结束。
  • ✅ 性能差异极小

2. 情况二:目标页不在内存中

  • 唯一索引:

需要将目标页从磁盘加载入内存进行唯一性判断 → 高成本的随机 IO

  • 普通索引:

操作直接写入 Change Buffer,延迟磁盘读写 → 性能提升明显

这是唯一索引与普通索引的性能关键差异点!

Change Buffer 的适用场景

适用场景 :

  • 写多读少 的系统
    例如:日志系统、账单系统等
    页面写完之后很少会被立即查询,Change Buffer 能发挥显著优势。

不适用场景 :

  • 写后立刻读 的业务模型

写操作刚缓存就被查询命中,触发 merge,反而增加了维护成本。

实际应用建议

  • 查询性能差异不大,但更新性能差异明显
  • 尽量优先选择普通索引,除非业务逻辑依赖数据库强一致性校验。
  • 写多读少场景下,配合开启 Change Buffer(默认开启),显著优化性能。
  • 使用机械硬盘时,Change Buffer 的效果更明显,应适当调大 innodb_change_buffer_max_size 参数(如 50%)
  • 若写后即读,可以考虑 关闭 Change Buffer

2. MySQL选错索引问题分析

2.1. 索引错选问题

问题背景与现象:

  • 有时 MySQL 执行 SQL 时并没有选择最佳索引,导致性能下降。
  • 通过一个具体例子说明了优化器因估算错误而选错索引的情况。

实验设计:

1. 表结构与索引

CREATE TABLE t (a INT,b INT,c INT,INDEX(a),INDEX(b)
);

2. 数据插入

  • 插入数据:(1,1,1)(100000,100000,100000) 共 10 万行。

预期查询语句

SELECT * FROM t WHERE a BETWEEN 10000 AND 20000;

3. 实验步骤(关键触发逻辑)

  • Session A:开启事务,未提交;
  • Session B:

删除所有数据;

重新插入 10 万行;

执行上面的查询。

4. 异常现象

  • 查询变慢,发现 优化器选择了全表扫描 而不是走 a 的索引。

执行计划对比与影响分析:

Q1:默认语句

SELECT * FROM t WHERE a BETWEEN 10000 AND 20000;
  • 使用了全表扫描,rows = 104620
  • 扫描耗时约 40ms

Q2:强制使用索引

SELECT * FROM t FORCE INDEX(a) WHERE a BETWEEN 10000 AND 20000;
  • 使用索引 arows = 10001
  • 扫描耗时约 21ms
  • 结论:Q2 明显更优

2.2. MySQL 优化器选错索引原因

优化器目标

  • 找出 执行代价最小 的执行计划;
  • 代价估算核心:行数(row estimate) + 回表成本

行数估算依赖“统计信息”

  • MySQL 使用索引的基数(cardinality) 估算结果行数;
  • 采样得出,不一定准确;
  • 命令查看基数:
SHOW INDEX FROM t;

统计信息采样机制

  • 参数 innodb_stats_persistent

ON:采样页数 20,触发更新阈值 10

OFF:采样页数 8,触发更新阈值 16

  • 采样带来的估算误差:

优化器以为 a between 10000 and 20000 会返回约 37000 行;

实际只有 10001 行,高估了结果量

回表代价高估

  • 索引 a 是二级索引,取出数据后需要回主键索引查全行(回表);
  • 优化器认为:

37000 次回表 ≈ 37000 次随机 IO;

而全表扫描只需约 100 页顺序读;

所以选择全表扫描。

2.3. 验证与解决方案

观察 EXPLAIN 输出

EXPLAIN SELECT * FROM t WHERE a BETWEEN 10000 AND 20000;
  • rows ≈ 37116(高估)→ 优化器认为成本更高。

修复手段:更新统计信息

ANALYZE TABLE t;
  • 执行后重新 EXPLAIN,rows 变为 10001;
  • 优化器重新选择正确索引。

总结与实践建议

类别

内容

问题核心

优化器因统计信息误差、高估回表代价,选错了索引

典型表现

EXPLAIN 中 rows

显著高估;执行计划走了全表扫描

核心原因

索引基数估算不准确;二级索引导致回表开销被放大

解决办法

使用 ANALYZE TABLE

更新统计信息

实践建议

当发现慢查询/rows 异常时,第一步先做统计更新;必要时使用 force index

临时规避

相关文章:

索引的选择与Change Buffer

1. 索引选择与Change Buffer 问题引出:普通索引 vs 唯一索引 ——如何选择? 在实际业务中,如果一个字段的值天然具有唯一性(如身份证号),并且业务代码已确保无重复写入,那就存在两种选择&…...

leetcode hot100刷题日记——30.两数之和

解答: 方法一:迭代 迭代大致过程就是: 算两条链表的当前位的和,加上上一位留下来的进位,就是新链表的当前位的数字。计算当前的进位。 这样,我们迭代需要的东西是:链表1,链表2&…...

Fastapi 学习使用

Fastapi 学习使用 Fastapi 可以用来快速搭建 Web 应用来进行接口的搭建。 参考文章:https://blog.csdn.net/liudadaxuexi/article/details/141062582 参考文章:https://blog.csdn.net/jcgeneral/article/details/146505880 参考文章:http…...

Ollama:本地大模型推理与应用的创新平台

引言 随着大语言模型(LLM)和生成式AI的快速发展,越来越多的开发者和企业希望在本地或私有环境中运行AI模型,以满足数据隐私、安全、低延迟和定制化的需求。Ollama 正是在这一背景下诞生的创新平台。它让大模型的本地部署、推理和集成变得前所未有的简单和高效。本文将系统…...

rtpinsertsound:语音注入攻击!全参数详细教程!Kali Linux教程!

简介 2006年8月至9月期间,我们创建了一个用于将音频插入指定音频(即RTP)流的工具。该工具名为rtpinsertsound。 该工具已在Linux Red Hat Fedora Core 4平台(奔腾IV,2.5 GHz)上进行了测试,但预…...

django项目开启debug页面操作有数据操作记录

在项目的主文件中setting中配置 """ Django settings for ProjectPrictice project.Generated by django-admin startproject using Django 3.0.1.For more information on this file, see https://docs.djangoproject.com/en/3.0/topics/settings/For the ful…...

【Vim】高效编辑技巧全解析

本篇将从光标移动技巧、常用快捷操作、组合命令运用等方面逐步讲解 vim 的使用。 📘 高效光标移动技巧 在 Vim 中,光标移动是编辑效率的核心之一。以下是一些必须掌握的移动命令,按使用频率和实用程度分类整理: 🔹 基…...

基于 Node.js 的 Express 服务是什么?

Express 是基于 ‌Node.js‌ 的一个轻量级、灵活的 Web 应用框架,用于快速构建 ‌HTTP 服务‌(如网站、API 接口等),以下是详细解析: ‌一、Express 的核心作用‌ ‌简化 Node.js 原生开发‌ Node.js 原生 http 模块虽…...

【C++】入门基础知识(1.5w字详解)

本篇博客给大家带来的是一些C基础知识!包含函数栈帧的详解! 🐟🐟文章专栏:C 🚀🚀若有问题评论区下讨论,我会及时回答 ❤❤欢迎大家点赞、收藏、分享! 今日思想&#xff1…...

Excel数据脱敏利器:自动保留格式的智能脱敏脚本

源码: import openpyxl import re import random import string from openpyxl.utils import get_column_letter from copy import copy from tqdm import tqdmdef mask_data(value):"""脱敏处理数据"""if isinstance(value, str):i…...

Photoshop2025(PS2025)软件及安装教程

在数字图像编辑领域,Adobe Photoshop 一直是无可争议的王者。如今,Photoshop 2025 重磅登场,再次为我们带来了惊喜与变革,进一步巩固了它在行业中的领先地位。 Photoshop 2025 在人工智能方面的升级令人瞩目。其全新的 “Magic Se…...

AI赋能开源:如何借助MCP快速解锁开源项目并提交你的首个PR

引子 很多同学都梦想为开源项目贡献力量,然而现实往往是——面对庞大复杂的项目,从入门到提交第一个有实质性代码的PR,时间跨度可能长达数年。传统路径通常是先从文档贡献开始,逐步深入理解项目架构,最终才能进行代码…...

计算机视觉---GT(ground truth)

在计算机视觉(Computer Vision, CV)领域,Ground Truth(GT,中文常译为“真值”或“ ground truth”) 是指关于数据的真实标签或客观事实,是模型训练、评估和验证的基准。它是连接算法与现实世界的…...

SQL进阶之旅 Day 9:高级索引策略

【SQL进阶之旅 Day 9】高级索引策略 在SQL查询性能调优中,索引是最为关键的优化手段之一。Day 3我们已经介绍了基础索引类型,今天我们将深入探讨高级索引策略,包括覆盖索引、索引选择性分析、强制使用索引等实用技巧。这些技术能显著提升复杂…...

R 语言科研绘图第 52 期 --- 网络图-分组

在发表科研论文的过程中,科研绘图是必不可少的,一张好看的图形会是文章很大的加分项。 为了便于使用,本系列文章介绍的所有绘图都已收录到了 sciRplot 项目中,获取方式: R 语言科研绘图模板 --- sciRplothttps://mp.…...

姜老师的MBTI课程:MBTI是可以转变的

我们先来看内向和外向这条轴,I和E内向和外向受先天遗传因素的影响还是比较大的,因为它事关到了你的硬件,也就是大脑的模型。但是我们在大五人格的排雷避坑和这套课程里面都强调了一个观点,内向和外向各有优势,也各有不…...

Django【应用 02】第一个Django应用开发流程图

第 1 部分 安装 Django创建项目初始化应用配置视图、路由 第 2 部分 数据库配置语言和时区配置应用设置表初始化模型创建、激活、表创建管理员账号创建应用加入管理页面 第 3 部分 更多视图(添加模板及模板调用、render、get_object_or_404、去除模板里的硬编码…...

湖北理元理律师事务所:用科学规划重塑债务人生

在债务问题日益普遍的当下,如何平衡还款压力与生活质量成为社会性难题。湖北理元理律师事务所通过“债务优化生活保障”的双轨服务模式,为债务人构建可持续的解决方案。其核心逻辑在于:债务处置不是剥夺生活,而是重建财务秩序。 …...

《江西棒球资讯》棒球运动发展·棒球1号位

联赛体系结构 | League Structure MLB模式 MLB采用分层体系(大联盟、小联盟),强调梯队建设和长期发展。 MLB operates a tiered system (Major League, Minor League) with a focus on talent pipelines and long-term development. 中国现…...

华为OD机试_2025 B卷_静态扫描(Python,100分)(附详细解题思路)

题目描述 静态扫描可以快速识别源代码的缺陷,静态扫描的结果以扫描报告作为输出: 1、文件扫描的成本和文件大小相关,如果文件大小为N,则扫描成本为N个金币 2、扫描报告的缓存成本和文件大小无关,每缓存一个报告需要…...

python打卡训练营打卡记录day41

知识回顾 数据增强卷积神经网络定义的写法batch归一化:调整一个批次的分布,常用与图像数据特征图:只有卷积操作输出的才叫特征图调度器:直接修改基础学习率 卷积操作常见流程如下: 1. 输入 → 卷积层 → Batch归一化层…...

GD32F103系列工程模版创建记录

准备条件: 1:首先需要下载GD32F103的官方库 2:GD32F103的软件包 3:KEIL5软件 4:单片机GD32F103C8T6 本文已经默认KEIL5已将安装好GD32F103的软件包了 步骤一 基本模版创建 1 打开KEIL5软件,新建工程&am…...

PH热榜 | 2025-05-24

1. Chance AI: Visual Reasoning 标语:通过视觉推理模型即时进行可视化搜索 介绍:Chance AI 是你的视觉小助手——只需拍一张照片,就能揭示你所看到事物背后的故事。通过我们全新的视觉推理功能,它不仅能识别物体,还…...

《高等数学》(同济大学·第7版) 的 详细章节目录

上册 第一章 函数与极限 映射与函数 数列的极限 函数的极限 无穷小与无穷大 极限运算法则 极限存在准则 两个重要极限 无穷小的比较 函数的连续性与间断点 连续函数的运算与初等函数的连续性 闭区间上连续函数的性质 🔹 重点节: 2-3&#xff…...

能源领域新兴技术论坛:EMQ 实时数据引擎构建工业智能中枢

5 月 26 日,由沙特阿美亚洲公司主办的能源领域新兴技术论坛在上海顺利举行。本次论坛聚焦智能工厂、无人机与机器人、可靠性与完整性、先进材料四大技术赛道,吸引了来自全球的能源企业、技术供应商及行业专家。 作为业内知名的 MQ AI 实时数据与智能产…...

kafka 常用知识点

文章目录 前言kafka 常用知识点1. kafka 概念2. 消息共享和广播3. 分区和副本数量奇偶数 前言 如果您觉得有用的话,记得给博主点个赞,评论,收藏一键三连啊,写作不易啊^ _ ^。   而且听说点赞的人每天的运气都不会太差&#xff0…...

Vue 核心技术与实战day07

1. vuex概述 2. 构建 vuex [多组件数据共享] 环境 <template><div id"app"><h1>根组件- {{ title }}- {{ count }}</h1><input :value"count" input"handleInput" type"text"><Son1></Son1>…...

关于5090安装tensorrt(python api)的过程

前提条件 硬件5090 ubuntu24.04 cuda版本12.8 找到适配的tensorrt版本 Nvidia官网 完事了之后找到对应版本tar安装包 tar -xvzf tensorrt-你的安装包.tar 然后记得将路径加入到环境变量中 #在这里插入代码片 gedit ~/.bashrc # 添加 export PATH/PATH/To/TensorRT-你的按安…...

[蓝桥杯]分考场

题目描述 nn 个人参加某项特殊考试。 为了公平&#xff0c;要求任何两个认识的人不能分在同一个考场。 求是少需要分几个考场才能满足条件。 输入描述 输入格式&#xff1a; 第一行&#xff0c;一个整数 nn (1≤n≤1001≤n≤100)&#xff0c;表示参加考试的人数。 第二行…...

CSS专题之层叠上下文

前言 石匠敲击石头的第 15 次 在平常开发的时候&#xff0c;有时候会遇到使用 z-index 调整元素层级没有效果的情况&#xff0c;究其原因还是因为对层叠上下文不太了解&#xff0c;看了网上很多前辈的文章&#xff0c;决定打算写一篇文章来梳理一下&#xff0c;如果哪里写的有问…...