MySQL:索引的优化方法
索引是帮助存储引擎快速获取数据的一种数据结构,形象的说就是索引是数据的目录。
索引创建的时机:
索引并不是越多越好的,虽然他再查询时会提高效率,但是保存索引和维护索引也需要一定的空间和时间成本的。
不创建索引:
- 当字段是类似于男/女这种的就没必要创建索引了,因为这样查询索引还是会查询到很多数据,没有给我们提升什么效率,而且MySQL 还有一个查询优化器,查询优化器发现某个值出现在表的数据行中的百分比很高的时候,它一般会忽略索引,进行全表扫描。
- 当字段经常更新时也最好不要建立索引,因为随着数据的更新,为了维护B+树的有序性,B+树也要进行更新调整,经常性的更新太浪费数据库性能了。
- 如果经常再查询语句中经常用不到的字段也不要创建索引了,反而浪费。
- 数据库数据少的时候也不用创建
创建索引:
- 字段具有唯一性,如学号等,这样查询提高效率很高。
- 经常被where作为查询条件的字段,可以创建索引。
- 经常被Order By、Group By 使用的字段,因为B+树本身具有有序性,当使用这两个查询语句时无需再对字段进行排序了。
优化索引的方法:
前缀索引优化:
前缀索引是拿某个字段的字符串的前几个字符建立索引。
- 只拿前几个字符作为索引节点,那就减小了索引的节点大小,降低了索引所占据的空间,
- 一个页内存储更多的索引节点更多,提高了查询效率。
- 但是前缀索引无法运用再Order By语句中,且无法把前缀索引作为索引覆盖。
覆盖索引优化:
Select sex From student where name = ‘张三’
索引覆盖:如果只根据name创建索引的话,那么再这个索引只能查询到张三的id,此时需要拿着这个id去主键索引中查询sex,进行回表操作。而当根据name、和sex创建了联合索引后,就不需要进行回表操作了,直接再这个索引中查询到sex,这一步就叫做索引覆盖。
所以当我们经常根据一个非主键字段查询另一个非主键字段的话,可以建立联合索引,避免回表操作。
主键索引最好是自增:
InnoDB 创建主键索引默认为聚簇索引,数据被存放在了 B+Tree 的叶子节点上。也就是说,同一个叶子节点内的各个数据是按主键顺序存放的,因此,每当有一条新的数据插入时,数据库会根据主键将其插入到对应的叶子节点中。
如果我们使用自增主键,那么每次插入的新数据就会按顺序添加到当前索引节点的位置,不需要移动已有的数据,当页面写满,就会自动开辟一个新页面。因为每次插入一条新记录,都是追加操作,不需要重新移动数据,因此这种插入数据的方法效率非常高。

如果我们使用非自增主键,由于每次插入主键的索引值都是随机的,因此每次插入新的数据时,就可能会插入到现有数据页中间的某个位置,这将不得不移动其它数据来满足新数据的插入,甚至需要从一个页面复制数据到另外一个页面,我们通常将这种情况称为页分裂。页分裂还有可能会造成大量的内存碎片,导致索引结构不紧凑,从而影响查询效率。

是不是一定要自增呢?
当某一个业务量增长非常快,数据量非常大,数据库性能无法满足业务需求的时候通常会实施分库分表,这个时候自增主键就不适用了,比如订单表,分成16个表,如果都使用自增的话,肯定会造成订单id重复,所以此时的解决方案就是分布式id,保证趋势递增即可。
主键字段的长度不要太大,因为主键字段长度越小,意味着二级索引的叶子节点越小(二级索引的叶子节点存放的数据是主键值),这样二级索引占用的空间也就越小。
索引最好设置为 NOT NULL:
-
索引列存在 NULL 就会导致优化器在做索引选择的时候更加复杂,更加难以优化,因为可为 NULL 的列会使索引、索引统计和值比较都更复杂,比如进行索引统计时,count 会省略值为NULL 的行。
-
NULL 值是一个没意义的值,但是它会占用物理空间,所以会带来的存储空间的问题,因为 InnoDB 存储记录的时候,如果表中存在允许为 NULL 的字段,那么行格式 中至少会用 1 字节空间存储 NULL 值列表。

防止索引失效:
我们设置了索引并不意味着一定会用上索引,再某些情况下索引也会失效。
- 当我们使用左或者左右模糊匹配的时候,也就是 Link %x 或者 Link %x% 这两种方式都会造成索引失效;
- 当我们在查询条件中对索引列做了计算、函数、类型转换操作,这些情况下都会造成索引失效;
- 联合索引要能正确使用需要遵循最左匹配原则,也就是按照最左优先的方式进行索引的匹配,否则就会导致索引失效。
- 在 WHERE 子句中,如果在 or 前的条件列是索引列,而在 or 后的条件列不是索引列,那么索引会失效。
相关文章:
MySQL:索引的优化方法
索引是帮助存储引擎快速获取数据的一种数据结构,形象的说就是索引是数据的目录。 索引创建的时机: 索引并不是越多越好的,虽然他再查询时会提高效率,但是保存索引和维护索引也需要一定的空间和时间成本的。 不创建索引:…...
前后端分离vue+nodejs+mysql高校学生社团管理系统xgp16
系统根据现有的管理模块进行开发和扩展,采用面向对象的开发的思想和结构化的开发方法对高校社团的现状进行系统调查。采用结构化的分析设计,该方法要求结合一定的图表,在模块化的基础上进行系统的开发工作。在设计中采用“自下而上”的思想&a…...
HCIA-Datacom实验指导手册:7 构建简单 IPv6 网络
HCIA-Datacom实验指导手册:7 构建简单 IPv6 网络 一、实验介绍:二、实验拓扑:三、实验目的:四、配置步骤:步骤 1 设备基础配置设备命名 步骤 2 配置设备及接口 IPv6 功能步骤 3 配置接口的 link-local 地址,…...
ElasticSearch搜索引擎使用指南
一、ES数据基础类型 1、数据类型 字符串 主要包括: text和keyword两种类型,keyword代表精确值不会参与分词,text类型的字符串会参与分词处理 数值 包括: long, integer, short, byte, double, float 布尔值 boolean 时间 date 数组 数组类型不…...
mysql与oracle的区别
一、并发性并发性是oltp数据库最重要的特性,但并发涉及到资源的获取、共享与锁定。mysql:mysql以表级锁为主,对资源锁定的粒度很大,如果一个session对一个表加锁时间过长,会让其他session无法更新此表中的数据。虽然InnoDB引擎的表…...
JVM相关面试题及常用命令参数
JVM常用命令和参数 常用命令: jps:查看进程及其相关信息 jmap:用来生成dump文件和查看堆相关的各类信息的命令 jstat:查看jvm运行时的状态信息 jstack:查看jvm线程快照的命令 jinfo:查看jvm参数和动态修改…...
Material UI 5 学习01-按钮组件
Material UI 5 学习01-按钮组件 一、安装Material UI二、 组件1、Button组件1、基础按钮2、variant属性3、禁用按钮4、可跳转的按钮5、disableElevation属性6、按钮的点击事件onClick 2、Button按钮的颜色和尺寸1、Button按钮的颜色2、按钮自定义颜色3、Button按钮的尺寸 3、图…...
解决移除数字问题的两种方法:暴力法和使用栈
题目 给你一个以字符串表示的非负整数 num 和一个整数 k ,移除这个数中的 k 位数字,使得剩下的数字最小。请你以字符串形式返回这个最小的数字 示例 1 : 输入:num "1432219", k 3 输出:"1219"…...
高校宣讲会管理系统|基于Springboot的高校宣讲会管理系统设计与实现(源码+数据库+文档)
高校宣讲会管理系统目录 目录 基于Springboot的高校宣讲会管理系统设计与实现 一、前言 二、系统功能设计 1、学生信息管理 2、企业信息管理 3、宣讲会管理 4、公告信息管理 四、数据库设计 1、实体ER图 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 …...
6_怎么看原理图之协议类接口之LCD笔记
首先想一想再前几篇文章讲的协议类的前提 1、双方约定好通信的协议 2、双方满足一定的时序要求 以上第二点又有一些要求: 1)弄清2440在这个通信协议中,能设置哪些时序的值,这些值的含义是什么——2440手册 2)弄清楚这…...
SpringCloud Alibaba 学习
一:SpringCloud Alibaba介绍 Spring Cloud Alibaba 致力于提供微服务开发的一站式解决方案。此项目包含开发分布式应用微服 务的必需组件,方便开发者通过 Spring Cloud 编程模型轻松使用这些组件来开发分布式应用服务。 依托 Spring Cloud Alibaba&…...
【ros2 control 机器人驱动开发】双关节多控制器机器人学习-example 4
【ros2 control 机器人驱动开发】双关节多控制器机器人学习-example 4 文章目录 前言一、创建controller相关二、测试运行测试forward_position_controller总结前言 本篇文章在上篇文章的基础上主要讲解双轴机器人驱动怎么编写机器人外部/内部(扭矩、压力)传感器数据反馈1,…...
Leetcode 3071. Minimum Operations to Write the Letter Y on a Grid
Leetcode 3071. Minimum Operations to Write the Letter Y on a Grid 1. 解题思路2. 代码实现 题目链接:3071. Minimum Operations to Write the Letter Y on a Grid 1. 解题思路 这一题思路上也是比较直接的,就是首先找到这个Y字符,然后…...
随想录算法训练营第五十一天|309.最佳买卖股票时机含冷冻期、714.买卖股票的最佳时机含手续费
309.最佳买卖股票时机含冷冻期 public class Solution {public int MaxProfit(int[] prices) {if(prices.Length<2){return 0;}int [,]dpnew int[prices.Length,4];dp[0,0]-prices[0];for(int i1;i<prices.Length;i){dp[i,0]Math.Max(dp[i-1,0],Math.Max(dp[i-1,3]-pric…...
【语言学习】std::transform函数
阅读llvm的这个提交时,发现了其中使用了一个函数std::transform(原文对其进行了一层封装) 如果不理解std::transform的三个参数的关系,就会对第三个参数的lambda表达式理解不了。其实,第三个参数的作用是提供给了一种…...
Java开发面试准备,轻松搞定SpringBoot数据校验
程序员:给多少工资,干多少事 我们不是经常会看到一个关于西游记的“悖论”吗: 为什么孙悟空初期大闹天宫的时候那么厉害?因为他自己当老板,打一群天庭的打工仔。 为什么取经路上又变得不行了?作为一个打工…...
信呼OA普通用户权限getshell方法
0x01 前言 信呼OA是一款开源的OA系统,面向社会免费提供学习研究使用,采用PHP语言编写,搭建简单方便,在中小企业中具有较大的客户使用量。从公开的资产治理平台中匹配到目前互联中有超过1W的客户使用案例。 信呼OA目前最新的版本是…...
MySQL进阶之(四)InnoDB数据存储结构之行格式
四、InnoDB数据存储结构之行格式 4.1 行格式的语法4.2 COMPACT 行格式4.2.1 记录的额外信息01、变长字段长度列表02、NULL 值列表03、记录头信息 4.2.2 记录的真实数据 4.3 Dynamic 和 Compressed 行格式4.3.1 字段的长度限制4.3.2 行溢出4.3.3 Dynamic 和 Compressed 行格式 4…...
【Qt学习笔记】(四)Qt窗口
Qt窗口 1 菜单栏1.1 创建菜单栏1.2 在菜单栏中添加菜单1.3 创建菜单项1.4 在菜单项之间添加分割线1.5 给菜单项添加槽函数1.6 给菜单项添加快捷键 2 工具栏2.1 创建工具栏2.2 设置停靠位置2.3 设置浮动属性2.4 设置移动属性2.5 添加 Action 3 状态栏3.1 状态栏的创建3.2 在状态…...
入侵和攻击模拟 (BAS) 技术应用实践
文章目录 前言一、实施BAS的必要性二、实施BAS的关键步骤1、识别网络中的脆弱区域2、创建基线安全模型3、选择合适的BAS工具4、进行模拟攻击测试5、分析结果并改进三、BAS实施中的挑战1、组织的专业知识和能力有限2、改变传统工作流程3、安全预算不足4、难以与现有安全基础设施…...
CANopen设备配置不求人:手把手教你用EDS/DCF文件玩转对象字典
CANopen设备配置实战:从EDS/DCF解析到对象字典高效配置 在工业自动化领域,CANopen协议因其开放性和灵活性成为设备互联的主流选择。而对象字典(Object Dictionary)作为CANopen设备的核心配置数据库,其管理效率直接影响项目开发周期。本文将带…...
保姆级教程:手把手解决CANoe 17.0在Win11系统上的安装失败问题(附临时文件夹清理方法)
CANoe 17.0在Windows 11系统安装全攻略:从权限配置到环境优化 当汽车电子工程师第一次在Windows 11系统上安装CANoe 17.0时,可能会遇到各种意想不到的障碍。不同于常见的软件安装过程,这款专业工具对系统环境有着更为严格的要求。本文将深入…...
CTF新手必看:用Python脚本搞定RSA常见攻击(附实战代码)
CTF密码学实战:Python脚本破解RSA五大攻击场景 在CTF竞赛中,RSA加密系统是最常见的密码学挑战之一。本文将带你深入实战,通过Python代码复现五种经典RSA攻击场景,从基础分解到高级数学技巧,每个案例都配有可直接运行的…...
ThinkPad双风扇终极控制指南:TPFanCtrl2让你的笔记本既静音又高效
ThinkPad双风扇终极控制指南:TPFanCtrl2让你的笔记本既静音又高效 【免费下载链接】TPFanCtrl2 ThinkPad Fan Control 2 (Dual Fan) for Windows 10 and 11 项目地址: https://gitcode.com/gh_mirrors/tp/TPFanCtrl2 你是否曾因ThinkPad风扇的持续噪音而分心…...
为什么你的Perplexity症状查询总返回模糊答案?——解析LLM医学知识蒸馏偏差、实体链接断层与实时性衰减问题
更多请点击: https://kaifayun.com 第一章:Perplexity症状查询功能的临床价值与典型失效场景 Perplexity症状查询功能在临床决策支持系统中承担着语义级症状归一化与鉴别诊断初筛的关键角色。它通过将患者自然语言描述(如“饭后右上腹闷胀、…...
39. UE5 GAS RPG:利用Motion Warping实现技能释放时的智能角色转向
1. Motion Warping插件基础与启用 Motion Warping是UE5官方提供的一个实验性插件,专门用于解决角色动画过程中的动态转向问题。这个插件的工作原理是在动画播放过程中插入一个"变形窗口",允许开发者指定某个时间段内角色的朝向或位置变化。我刚…...
主流 RAG 架构与方法总结
一. 基础知识库RAG:Naive RAG / Standard RAG 1.1 架构流程 最基础,最常见的 RAG 架构。 文档上传 → 文档解析 → 文本切块 Chunking → Embedding 向量化 → 写入向量库 / 搜索索引 → 用户提问 → 向量检索 Top-K → 拼接上下文 → LLM 生成答案 …...
CANN/asc-devkit Round接口文档
Round 【免费下载链接】asc-devkit 本项目是CANN 推出的昇腾AI处理器专用的算子程序开发语言,原生支持C和C标准规范,主要由类库和语言扩展层构成,提供多层级API,满足多维场景算子开发诉求。 项目地址: https://gitcode.com/cann…...
NLP-Models-Tensorflow在情感分析中的应用:79种分类器的全面评估
NLP-Models-Tensorflow在情感分析中的应用:79种分类器的全面评估 【免费下载链接】NLP-Models-Tensorflow Gathers machine learning and Tensorflow deep learning models for NLP problems, 1.13 < Tensorflow < 2.0 项目地址: https://gitcode.com/gh_mi…...
Perplexity搜索效率提升73%的6个隐藏技巧:资深AI分析师亲测有效
更多请点击: https://intelliparadigm.com 第一章:Perplexity搜索效率提升73%的底层动因解析 Perplexity 作为新一代语义优先的AI搜索引擎,其搜索延迟中位数从 1.84s 降至 0.50s(实测提升 73%),这一突破并…...
