一文详解Mysql索引
背景
索引是存储引擎用于快速找到一条记录的数据结构。索引对良好的性能非常关键。尤其是当表中的数据量越来越大时,索引对性能的影响愈发重要。接下来,就来详细探索一下索引。
索引是什么
索引(Index)是帮助数据库高效获取数据的数据结构。它们被用作包含所关心数据的表指针,通过一个索引,能从表中直接找到一个特定的记录,而不必连续顺序扫描这个表。
索引的分类
索引有很多种类型,可以为不同的场景提供更好的性能。在Mysql中,索引是存储在引擎层而不是服务器层实现的,所以不同的存储引擎有不同的实现,并没有统一的索引标准。
按照存储结构划分
B-Tree 索引(B-树索引)
B-Tree 索引是最常见的索引类型,几乎所有的数据库系统都支持这种索引。B-Tree 索引是一种平衡树结构,能够保持数据的有序性,并且支持高效的查找、插入和删除操作。
特点:
- 平衡性:B-Tree 是一种平衡树,所有叶子节点的深度相同。
- 多路性:每个节点可以有多个子节点,这样可以减少树的高度,从而减少查找路径。
- 顺序访问:B-Tree 的叶子节点之间通过指针相连,支持顺序访问。
优点:
- 支持范围查询和排序操作。
- 插入和删除操作较为高效。
缺点:
- 维护平衡树的结构需要一定的开销。
- 对于频繁的插入和删除操作,性能可能会有所下降。
2. B+Tree 索引(B+树索引)
B+Tree 是 B-Tree 的变种,是数据库系统中最常用的索引类型。B+Tree 在 B-Tree 的基础上进行了优化,使其更适合磁盘存储和范围查询。
特点:
- 非叶子节点只存储键值信息:非叶子节点不存储数据,只存储键值和指向子节点的指针。
- 叶子节点存储数据:所有数据都存储在叶子节点中,叶子节点之间通过指针相连,形成一个双向链表。
- 顺序访问指针:叶子节点之间有顺序访问指针,支持高效的范围查询。
优点:
- 支持高效的范围查询和排序操作。
- 由于非叶子节点只存储键值信息,可以存储更多的键值,从而减少树的高度,提高查找效率。
缺点:
- 维护树的平衡结构需要一定的开销。
- 对于频繁的插入和删除操作,性能可能会有所下降。
3. Hash 索引
Hash 索引基于哈希表实现,通过哈希函数将键值映射到哈希表中的位置,从而实现快速查找。
特点:
- 哈希函数:通过哈希函数将键值映射到哈希表中的位置。
- 等值查询:适用于等值查询,不支持范围查询。
优点:
- 查找速度非常快,时间复杂度为 O(1)。
- 哈希表结构紧凑,占用空间较小。
缺点:
- 不支持范围查询和排序操作。
- 当发生哈希冲突时,性能会下降。
- 需要处理哈希冲突的问题。
4. R-Tree 索引(R-树索引)
R-Tree 索引主要用于多维数据的存储和查询,常用于地理信息系统(GIS)和空间数据库中。
特点:
- 多维数据:支持多维数据的存储和查询。
- 空间查询:适用于范围查询、邻近查询和包含查询等空间查询操作。
优点:
- 支持高效的多维数据查询。
- 适用于地理信息系统和空间数据库。
缺点:
- 维护树的结构需要一定的开销。
- 对于高维数据,性能可能会下降。
5. 全文索引(Full-Text 索引)
全文索引用于对文本数据进行全文搜索,适用于大文本字段的模糊查询。
特点:
- 关键词搜索:支持对文本数据中的关键词进行搜索。
- 倒排索引:通常使用倒排索引来实现全文搜索。
优点:
- 支持高效的全文搜索。
- 适用于大文本字段的模糊查询。
缺点:
- 创建和维护全文索引需要一定的开销。
- 对于小文本字段,全文索引的优势不明显。
按照逻辑功能划分
- 普通索引:最基本的索引类型,没有唯一性之类的限制。用于加速对表中数据的查询。
- 唯一索引:不允许其中任何两行具有相同索引值的索引。用于确保数据的唯一性。
- 主键索引:一种特殊的唯一索引,不允许有空值。一个表只能有一个主键索引。
- 全文索引:用于对文本数据进行全文搜索。适用于大文本字段的模糊查询。
按照物理实现划分
- 聚集索引:表中行的物理顺序与键值的逻辑顺序相同。一个表只能有一个聚集索引。
- 非聚集索引:表中行的物理顺序与键值的逻辑顺序可以不同。一个表可以有多个非聚集索引。
索引的优点
- 加速数据检索:索引可以显著提高查询的速度,尤其是在大型表中进行搜索时。
- 保证数据唯一性:唯一索引可以确保数据库表中每一行数据的唯一性。
- 加速表之间的连接:在连接操作中,索引可以显著提高连接的速度。
- 减少排序和分组的时间:在使用
ORDER BY
、GROUP BY
子句进行数据检索时,利用索引可以减少排序和分组的时间。
索引的缺点
- 占用物理空间:索引需要占用额外的存储空间。
- 降低数据维护速度:当对表中的数据进行增加、删除和修改的时候,索引也要动态的维护,降低了数据的维护速度。
如何选择索引
- 频繁查询的字段:对经常出现在
WHERE
子句中的字段建立索引。 - 连接操作的字段:对连接操作中使用的字段建立索引。
- 排序和分组的字段:对
ORDER BY
和GROUP BY
子句中的字段建立索引。
如何使用索引
- 选择合适的索引类型:根据查询需求选择普通索引、唯一索引、聚集索引或非聚集索引。
- 避免过多的索引:索引数量过多会影响数据的插入、更新和删除操作的性能。
- 使用覆盖索引:在查询中只选择索引列,避免回表操作。
- 定期重建索引:对频繁更新的表,定期重建索引以保持索引的效率。
索引失效的场景
索引失效是指在数据库查询过程中,由于某些原因导致索引无法被有效利用,从而使查询性能下降,甚至退化为全表扫描的情况。以下是一些常见的索引失效场景:
-
使用函数或表达式:在查询中对列使用函数、表达式或计算,可能导致索引无法生效。
-
使用通配符开头的模糊搜索:如
LIKE '%pattern%'
形式的模糊搜索,索引通常无法用于查找匹配项。避免方法:尽量避免通配符开头,可以考虑使用'pattern%'
来进行模糊搜索。 -
类型隐式转换:参数类型与字段类型不匹配,导致类型发生了隐式转换,索引失效。
-
使用OR操作:查询条件使用OR关键字,如果其中一个字段没有创建索引,则可能导致整个查询语句索引失效。
-
违背最左匹配原则:在使用组合索引时,不满足最左匹配原则等。
-
两列做比较:在查询条件中对两个索引列进行比较操作,可能导致索引失效。
-
不等于比较:使用不等(<> 或 !=)进行比较时,可能导致索引失效。
-
其他:数据库优化器的其他优化策略,比如优化器认为在某些情况下,全表扫描比走索引快,则它就会放弃索引。
了解这些索引失效的场景和避免方法,可以帮助我们更好地设计和维护数据库索引,从而提高数据库查询性能。
相关文章:
一文详解Mysql索引
背景 索引是存储引擎用于快速找到一条记录的数据结构。索引对良好的性能非常关键。尤其是当表中的数据量越来越大时,索引对性能的影响愈发重要。接下来,就来详细探索一下索引。 索引是什么 索引(Index)是帮助数据库高效获取数据的…...

基于JAVA+SpringBoot+Vue的旅游管理系统
基于JAVASpringBootVue的旅游管理系统 前言 ✌全网粉丝20W,csdn特邀作者、博客专家、CSDN[新星计划]导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末附源码下载链接🍅 哈喽兄…...

STM32_实验3_控制RGB灯
HAL_Delay 是 STM32 HAL 库中的一个函数,用于在程序中产生一个指定时间的延迟。这个函数是基于系统滴答定时器(SysTick)来实现的,因此可以实现毫秒级的延迟。 void HAL_Delay(uint32_t Delay); 配置引脚: 点击 1 到 IO…...

RISC-V笔记——Pipeline依赖
1. 前言 RISC-V的RVWMO模型主要包含了preserved program order、load value axiom、atomicity axiom、progress axiom和I/O Ordering。今天主要记录下preserved program order(保留程序顺序)中的Pipeline Dependencies(Pipeline依赖)。 2. Pipeline依赖 Pipeline依赖指的是&a…...

构建后端为etcd的CoreDNS的容器集群(六)、编写自动维护域名记录的代码脚本
本文为系列测试文章,拟基于自签名证书认证的etcd容器来构建coredns域名解析系统。 一、前置文章 构建后端为etcd的CoreDNS的容器集群(一)、生成自签名证书 构建后端为etcd的CoreDNS的容器集群(二)、下载最新的etcd容…...

Leetcode 剑指 Offer II 098.不同路径
题目难度: 中等 原题链接 今天继续更新 Leetcode 的剑指 Offer(专项突击版)系列, 大家在公众号 算法精选 里回复 剑指offer2 就能看到该系列当前连载的所有文章了, 记得关注哦~ 题目描述 一个机器人位于一个 m x n 网格的左上角 (起始点在下…...

LabVIEW智能螺杆空压机测试系统
基于LabVIEW软件开发的螺杆空压机测试系统利用虚拟仪器技术进行空压机的性能测试和监控。系统能够实现对螺杆空压机关键性能参数如压力、温度、流量、转速及功率的实时采集与分析,有效提高测试效率与准确性,同时减少人工操作,提升安全性。 项…...
在 Ubuntu 22.04 上安装 PHP 8.2
在 Ubuntu 22.04 上安装 PHP 8.2,可以按照以下步骤进行: 更新系统软件包: 首先,确保你的系统软件包是最新的。 sudo apt update sudo apt upgrade 安装 PHP PPA(Personal Package Archive): U…...

Java生死簿管理小系统(简单实现)
学习总结 1、掌握 JAVA入门到进阶知识(持续写作中……) 2、学会Oracle数据库入门到入土用法(创作中……) 3、手把手教你开发炫酷的vbs脚本制作(完善中……) 4、牛逼哄哄的 IDEA编程利器技巧(编写中……) 5、面经吐血整理的 面试技…...

【VoceChat】一个即时聊天(IM)软件,又是一个可以嵌入任何网页聊天系统
为什么要搭建私人聊天软件 在当今数字化时代,聊天软件已经成为人们日常沟通和协作的重要工具。市面上的公共聊天平台虽然方便,但也伴随着诸多隐私、安全、广告和功能限制的问题。对于那些注重数据安全、追求高效沟通的个人或团队来说,搭建一…...

【LeetCode】动态规划—96. 不同的二叉搜索树(附完整Python/C++代码)
动态规划—96. 不同的二叉搜索树 题目描述前言基本思路1. 问题定义2. 理解问题和递推关系二叉搜索树的性质:核心思路:状态定义:状态转移方程:边界条件: 3. 解决方法动态规划方法:伪代码: 4. 进一…...

Nginx UI 一个可以管理Nginx的图形化界面工具
Nginx UI 是一个基于 Web 的图形界面管理工具,支持对 Nginx 的各项配置和状态进行直观的操作和监控。 Nginx UI 的功能非常丰富: 在线查看服务器 CPU、内存、系统负载、磁盘使用率等指标 在线 ChatGPT 助理 一键申请和自动续签 Let’s encrypt 证书 在…...

Vue向上滚动加载数据时防止内容闪动
目前的需求:当前组件向上滚动加载数据,dom加载完后,页面的元素位置不能发生变化 遇到的问题:加载完数据后,又把滚轮滚到之前记录的位置时,内容发生闪动 现在的方案: 加载数据之前记录整体滚动条…...
基于QT、ARM的智能停车管理系统+高分项目+源码
Parking-management-system 本系统基于QT、ARM开发板、Linux系统并对接百度AI 1.1 项目目的: 创建一个智能停车管理系统,能够停入车辆和取出车辆以及查询车辆停入停车场的状态并且计算车辆离开时收费情况。 1.2 项目意义: 实现停车场智能抬杆和智能收费系统&…...

1.6,unity动画Animator屏蔽某个部位,动画组合
动画组合 一边跑一边攻击 using System.Collections; using System.Collections.Generic; using UnityEngine;public class One : MonoBehaviour {private Animator anim;// Start is called before the first frame updatevoid Start(){anim GetComponent<Animator>();…...
发动机冷却系统排空气
发动机冷却系统排空气的几种常见方法 发动机冷却系统是汽车发动机的重要组成部分,它的主要作用是通过循环冷却液来吸收和散发发动机产生的热量,确保发动机在正常工作温度下运行。然而,在冷却系统的运行过程中,由于各种原因&#…...

三周精通FastAPI:1 第一步入门
FastAPI是一个非常棒的python web和api框架,准备用三周的时间“精通它” 学习流程参考FastAPI官网的用户教程:教程 - 用户指南 - FastAPI 学前提示 运行代码 所有代码片段都可以复制后直接使用(它们实际上是经过测试的 Python 文件&#x…...
RestTemplate基本使用之HTTP实现GET请求和POST请求
一、GET请求实例 public static TianQi getTianQi(String city) {RestTemplate restTemplate new RestTemplate();HashMap res restTemplate.getForObject("http://www.tianqiapi.com/api/?versionv6&appid15118158&appsecretgVNnwva8&city" city, H…...
2024-10-18 问AI: [AI面试题] 神经网络有哪些不同类型?
文心一言 神经网络有多种不同类型,每种类型都有其特定的结构和应用场景。以下是一些主要的神经网络类型: 前馈神经网络(FNN): 也称为全连接神经网络或感知器网络。由输入层、隐藏层和输出层组成,信息流是单…...

【开源免费】基于SpringBoot+Vue.JS课程作业管理系统(JAVA毕业设计)
本文项目编号 T 023 ,文末自助获取源码 \color{red}{T023,文末自助获取源码} T023,文末自助获取源码 目录 一、系统介绍二、演示录屏三、启动教程四、功能截图五、文案资料5.1 选题背景5.2 国内外研究现状5.3 可行性分析 六、核心代码6.1 查…...

SpringBoot-17-MyBatis动态SQL标签之常用标签
文章目录 1 代码1.1 实体User.java1.2 接口UserMapper.java1.3 映射UserMapper.xml1.3.1 标签if1.3.2 标签if和where1.3.3 标签choose和when和otherwise1.4 UserController.java2 常用动态SQL标签2.1 标签set2.1.1 UserMapper.java2.1.2 UserMapper.xml2.1.3 UserController.ja…...

K8S认证|CKS题库+答案| 11. AppArmor
目录 11. AppArmor 免费获取并激活 CKA_v1.31_模拟系统 题目 开始操作: 1)、切换集群 2)、切换节点 3)、切换到 apparmor 的目录 4)、执行 apparmor 策略模块 5)、修改 pod 文件 6)、…...

【WiFi帧结构】
文章目录 帧结构MAC头部管理帧 帧结构 Wi-Fi的帧分为三部分组成:MAC头部frame bodyFCS,其中MAC是固定格式的,frame body是可变长度。 MAC头部有frame control,duration,address1,address2,addre…...

【网络安全产品大调研系列】2. 体验漏洞扫描
前言 2023 年漏洞扫描服务市场规模预计为 3.06(十亿美元)。漏洞扫描服务市场行业预计将从 2024 年的 3.48(十亿美元)增长到 2032 年的 9.54(十亿美元)。预测期内漏洞扫描服务市场 CAGR(增长率&…...

基于当前项目通过npm包形式暴露公共组件
1.package.sjon文件配置 其中xh-flowable就是暴露出去的npm包名 2.创建tpyes文件夹,并新增内容 3.创建package文件夹...

从零开始打造 OpenSTLinux 6.6 Yocto 系统(基于STM32CubeMX)(九)
设备树移植 和uboot设备树修改的内容同步到kernel将设备树stm32mp157d-stm32mp157daa1-mx.dts复制到内核源码目录下 源码修改及编译 修改arch/arm/boot/dts/st/Makefile,新增设备树编译 stm32mp157f-ev1-m4-examples.dtb \stm32mp157d-stm32mp157daa1-mx.dtb修改…...
今日科技热点速览
🔥 今日科技热点速览 🎮 任天堂Switch 2 正式发售 任天堂新一代游戏主机 Switch 2 今日正式上线发售,主打更强图形性能与沉浸式体验,支持多模态交互,受到全球玩家热捧 。 🤖 人工智能持续突破 DeepSeek-R1&…...

Netty从入门到进阶(二)
二、Netty入门 1. 概述 1.1 Netty是什么 Netty is an asynchronous event-driven network application framework for rapid development of maintainable high performance protocol servers & clients. Netty是一个异步的、基于事件驱动的网络应用框架,用于…...
Java数值运算常见陷阱与规避方法
整数除法中的舍入问题 问题现象 当开发者预期进行浮点除法却误用整数除法时,会出现小数部分被截断的情况。典型错误模式如下: void process(int value) {double half = value / 2; // 整数除法导致截断// 使用half变量 }此时...

免费数学几何作图web平台
光锐软件免费数学工具,maths,数学制图,数学作图,几何作图,几何,AR开发,AR教育,增强现实,软件公司,XR,MR,VR,虚拟仿真,虚拟现实,混合现实,教育科技产品,职业模拟培训,高保真VR场景,结构互动课件,元宇宙http://xaglare.c…...