【MySQL】索引篇

SueWakeup

                                                      个人主页:SueWakeup

                                                      系列专栏:学习技术栈

                                                      个性签名:保留赤子之心也许是种幸运吧

本文封面由 凯楠📸友情提供

目录

本系列传送门

 1. 什么是索引

2.  索引的特性

3. 索引的分类

4.  索引的优点及缺点

优点

缺点

5. 如何添加索引

添加主键索引

添加唯一索引

 添加普通索引

添加全文索引

 添加联合索引

6. B+Tree 索引(MySQL 5.5 之后默认)

6.1 B+Tree 指向查找操作

6.2 MySQL 为什么选择 B+Tree

7. 哈希索引

8. 什么是回表?

9. 索引覆盖

好处

措施

10. 索引的使用场景

11. 索引的失效场景

12. 索引的优化

 注:手机端浏览本文章可能会出现 “目录”无法有效展示的情况,请谅解,点击侧栏目录进行跳转 


本系列传送门

1. 数据库排名

2.【MySQL】数据库开篇

3.【MySQL】索引篇

4.【MySQL】事务篇

5.【MySQL】锁篇


 1. 什么是索引

  • 索引是一种用于快速查询和检查数据的数据库存储结构,保存了数据库指定字段的数据位置
  • MySQL 最经常用的存储结构: B+Tree 和 Hash
  • 作用:提升数据库的查询性能,如果没有索引,数据库的查询会进行全表搜索,消耗时间,造成大量磁盘的IO操作;如果建立索引,则通过索引中所保存的数据位置,快速找到表中的对应记录

2.  索引的特性

  1. 高效性:利用索引可以提高数据库的查询效率
  2. 唯一性:索引可以确保所查的数据的唯一性
  3. 完整性:加速表和表之间的连接,实现表与表之间的参照完整性
  4. 特殊能力:通过使用索引,可以在查询过程中,使用优化隐藏,提高系统性能

3. 索引的分类

分类方式分类描述
存储方式B+Tree 索引InnoDB 存储引擎的 B+Tree 索引分为主键索引和辅助索引
哈希索引自适应哈希索引
逻辑主键索引主键列使用索引
辅助索引唯一索引保证该数据列的唯一性,允许数据为Null,但不能出现重复数据,一张表允许创建多个唯一索引
普通索引为了快速查询数据,一张表允许创建多个普通索引,允许数据重复和 Null
前缀索引只适用于字符串类型的数据,对文本的前几个字符创建索引,相比普通索引建立的数据更小
全文索引为了检索大文本数据中的关键字的信息,是目前搜索引擎数据库使用的一种技术
使用字段单列索引针对单个列创建的索引,当查询条件只涉及单列时,可以有效提高查询的性能
组合索引针对多个列创建的索引,当查询条件涉及到多个列时,可以提供更好的性能,查询时必须按照索引的顺序提供条件

4.  索引的优点及缺点

  • 优点

    • 加快数据的检索速度,减少数据库需要扫描的数据行数
    • 通过创建唯一索引,可以保证数据库表中每一行数据的唯一性
  • 缺点

    • 创建索引和维护索引需要耗费许多时间
    • 对表中数据进行增删改的时候,如果数据有索引,索引也需要动态的修改,降低SQL的执行效率
    • 索引需要物理文件存储,耗费一定空间
    • 如果数据库的数据量比较小,那么使用索引也不能带来很大提升

5. 如何添加索引

  • 添加主键索引

alter table `table_name` add primary key(`column`)
  • 添加唯一索引

alter table `table_name` add unique(`column`)
  •  添加普通索引

alter table `table_name` add index index_name(`column`)
  • 添加全文索引

alter table `table_name` add fulltext(`column`)
  •  添加联合索引

alter table `table_name` add index index_name(`column1`,`column2`,`column3`)

6. B+Tree 索引(MySQL 5.5 之后默认

  • 因为 B+ Tree 的有序性,所以除了用于查找,还可以用于排序和分组
  • InnoDBB+Tree索引分为主键索引辅助索引
    • 主键索引的叶子节点 data域记录着完整的数据记录
    • 原则:尽量选择访问频率高的字段值作为主键索引
    • 辅助索引的叶子节点data域记录着主键的值,因此在使用辅助索引进行查找时,需要先查找到主键值,然后再到主键索引中进行查找

6.1 B+Tree 指向查找操作

  • 进行查找操作时,首先在根节点进行二分查找,找到对应的叶子节点。然后在叶子节点上进行二分查找,找出 key 所对应的 data
  • 区间查找操作时,由于叶子节点形成了有序列表,可以直接通过指针继续遍历相邻个叶子节点,提高区间查询效率

6.2 MySQL 为什么选择 B+Tree

  1. B+Tree全表扫描能力强,如果基于Btree进行扫描,需要把整棵树遍历一遍,而B+Tree只需要遍历所有叶子节点
  2. B+Tree排序能力更强
  3. B+Tree磁盘读写能力更强,根节点和枝节点不保存数据区,保存的关键字比Btree多。
  4. B+Tree查询性能稳定,B+Tree数据只保存在叶子节点,每次查询数据,查询IO次数是稳定的

7. 哈希索引

  • 能以O(1)时间复杂度进行查找,但是失去了有序性
  • 无法用于排序和分组
  • 只支持精确查找,无法用于部分查找和范围查找
  • InnoDB存储引擎有一个特殊的功能叫”自适应哈希索引“,当某个索引值被使用的非常频繁时,会在B+Tree索引之上创建一个哈希索引,让B+Tree索引具有哈希索引的一些优点

8. 什么是回表?

  • 在使用索引进行查询时,如果查询需要返回的数据不在索引中,MySQL会根据索引中的数据行的主键值再次到表中取检索数据

9. 索引覆盖

一个查询可以完全使用索引来满足,而无需访问实际的数据行

好处

  1. 减少磁盘 IO:从索引中获取,不需要回表访问实际的数据行
  2. 减少内存开销:当查询只涉及到索引列,MySQL只需要将索引数据加载到内存中
  3. 减少了网络传输开销:当数据库和应用程序分布在不同的服务器上时,索引覆盖可以减少从数据库服务器到应用服务器之间的网络传输开销

措施

  1. 使用合适的查询语句:编写查询语句时,明确指定需要返回的列,并确保这些列都包含在索引中。避免使用 select *,它可能无法实现索引覆盖
  2. 合理涉及索引:确保索引包含需要的所有列,尽量覆盖查询所需的列

10. 索引的使用场景

  1. 匹配全值:对索引中所有列都指定具体值,即对索引中的所有列都有等值匹配的条件。
  2. 匹配值的范围查询:对索引的值能够进行范围查找
  3. 匹配最左前缀:仅仅使用索引中的最左边列进行查询。比如组合索引(col1,col2,col3)
  4. 能够被col1,col1+col2,col1+col2+col3的等值查询利用到的。
  5. 仅对索引进行查询:当查询列都在索引字段中。即select中的列都在索引中。
  6. 匹配列前缀:仅仅使用索引的第一列,并且只包含索引第1列的开头部分进行查找。例
  7. 如:WHERE title LIKE ‘xxx%’
  8. 索引部分等值匹配,部分范围匹配
  9. 若列名是索引,则使用column_name is null就会使用索引

11. 索引的失效场景

  1. 使用模糊查询时,%在字符的左侧
  2. 组合索引包含从左到右的字段使用索引,不包含左边的字段索引失效
  3. 数据类型不匹配
  4. 不等于运算(!= 、 <、>、not in)
  5. 字段内容为 null
  6. 添加索引的字段上使用函数或计算
  7. or前后条件中的字段都包含索引或前后有一个字段不包含索引

12. 索引的优化

  1. 选择合适的字段创建索引
  2. 被频繁更新的字段应该慎重建立索引
  3. 尽可能考虑建立联合索引而不是单列索引
  4. 避免冗余索引
  5. 考虑在字符串类型的字段上使用前缀索引代替普通索引
  6. 避免 where子句中对索引字段使用函数,这会造成索引失效

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

全面的网络流量监控

流量监控指的是对数据流进行的监控&#xff0c;通常包括出数据、入数据的速度、总流量。通过网络流量监控&#xff0c;组织可以确保只有业务关键型流量通过网络传输&#xff0c;并限制不需要的网络流量&#xff0c;从而提高网络效率&#xff0c;又可以防止停机、减少 MTTR、帮助…

【氮化镓】微波脉冲对GaN HEMT失效的影响

本文是一篇关于高功率微波脉冲作用下GaN HEMT&#xff08;高电子迁移率晶体管&#xff09;热电多物理场耦合失效的实验研究。文章由Xiangdong Li等人撰写&#xff0c;发表在2023年11月的《IEEE Transactions on Electron Devices》上。文章通过实验研究了在高功率微波脉冲应力下…

英特尔推出中国特供版Gaudi 3芯片,性能暴降92%以应对美国出口管制|TodayAI

英特尔近期发布消息&#xff0c;其将在中国市场推出专为该地区定制的“特供版”Gaudi 3 AI芯片&#xff0c;以符合美国对AI芯片的出口管制。这一版本包括HL-328型号的OAM兼容夹层卡&#xff0c;预计将于6月24日发布&#xff1b;以及HL-388型号的PCIe加速卡&#xff0c;计划在9月…

(二十八)Flask之wtforms库【上手使用篇】

目录&#xff1a; 每篇前言&#xff1a;用户登录验证&#xff1a;用户注册验证&#xff1a;使用示例&#xff1a; 抽象解读使用wtforms编写的类&#xff1a;简单谈一嘴&#xff1a;开始抽象&#xff1a; 每篇前言&#xff1a; &#x1f3c6;&#x1f3c6;作者介绍&#xff1a;【…

L3 【哈工大_操作系统】操作系统启动

本节要点&#xff1a; 1、理解 OS 启动过程发生了什么&#xff0c;理解 OS 与 硬件 与 应用 之间的关系 2、本节讲解了 setup 模块 和 system 模块实现的功能 1、计算机上电时&#xff0c;操作系统在硬盘&#xff08;磁盘&#xff09;上&#xff0c;为了“取指执行”&#xff0…

Vite多环境配置与打包:灵活高效的Vue开发工作流

&#x1f31f; 前言 欢迎来到我的技术小宇宙&#xff01;&#x1f30c; 这里不仅是我记录技术点滴的后花园&#xff0c;也是我分享学习心得和项目经验的乐园。&#x1f4da; 无论你是技术小白还是资深大牛&#xff0c;这里总有一些内容能触动你的好奇心。&#x1f50d; &#x…

京东商品详情接口可以获取到那些数据?商品属性价格sku主图

京东商品详情接口可以获取到关于商品的丰富数据&#xff0c;包括但不限于以下内容&#xff1a; 商品基本信息&#xff1a;例如商品标题、价格、销量等。商品详情描述&#xff1a;这包括商品的详细描述、规格参数、包装清单等。商品评价信息&#xff1a;比如商品的好评率、评价…

图神经网络

图的性质 聚类系数 C i E i T i C_i \frac{E_i}{T_i} Ci​Ti​Ei​​ E i E_i Ei​表示节点 i i i的邻居实际存在的边的数量&#xff0c; T i T_i Ti​表示节点 i i i的邻居可能&#xff08;最多&#xff09;存在的边的数量 理论溯源 聚类系数这一概念首先源于论文“Colle…

OpenCV的查找命中或未命中

返回:OpenCV系列文章目录&#xff08;持续更新中......&#xff09; 上一篇:OpenCV4.9更多形态转换 下一篇:OpenCV系列文章目录&#xff08;持续更新中......&#xff09; 目标 在本教程中&#xff0c;您将学习如何使用 Hit-or-Miss 转换&#xff08;也称为 Hit-and-Miss 转…

已解决:前端直传阿里oss报错跨域问题,“No ‘Access-Control-Allow-Origin‘”,这个错误基本就是在阿里的开放平台没做规则配置(附我封装的上传源码)

解决方案&#xff08;我封装的上传代码在后面“封装上传”部分&#xff09;&#xff1a; 就直接上阿里oss管理后台去增加一个跨域规则&#xff1a;见图片&#xff0c;特详细 配置成这样点确定就好了&#xff0c;就这么简单 案发背景&#xff1a; 标题其实就已经是答案了&…

2024年第十五届蓝桥杯C/C++B组复盘(持续更新)

&#x1f525;博客主页&#xff1a; 小羊失眠啦. &#x1f3a5;系列专栏&#xff1a;《C语言》 《数据结构》 《C》 《Linux》 《Cpolar》 ❤️感谢大家点赞&#x1f44d;收藏⭐评论✍️ 文章目录 试题A&#xff1a;握手问题问题描述思路 试题B&#xff1a;小球反弹问题描述思路…

【算法】字符串

个人主页 &#xff1a; zxctscl 如有转载请先通知 题目 1. 14. 最长公共前缀1.1 分析1.2 代码 2. 5. 最长回文子串2.1 分析2.2 代码 3. 67. 二进制求和3.1 分析3.2 代码 4. 43. 字符串相乘4.1 分析4.2 代码 1. 14. 最长公共前缀 1.1 分析 从第一个字符串开始两两比较&#xff…

LlamaIndex 文档 2

文章目录 一、构建 LLM 应用构建LLM 应用的关键步骤 二、使用LLM可用的LLM使用本地LLM Prompts 三、加载数据&#xff08;提取&#xff09;Loaders1、使用 SimpleDirectoryReader 加载2、使用 LlamaHub 的 Readers3、直接创建文档 转换 Transformations1、高级转换 API2、较低级…

Unity URP PBR_Cook-Torrance模型

Cook-Torrance模型是一个微表面光照模型&#xff0c;认为物体的表面可以看作是由许多个理想的镜面反射体微小平面组成的。 单点反射镜面反射漫反射占比*漫反射 漫反射 基础色/Π 镜面反射DFG/4(NV)(NL) D代表微平面分布函数&#xff0c;描述的是法线与半角向量normalize(L…

自编译支持CUDA硬解的OPENCV和FFMPEG

1 整体思路 查阅opencv的官方文档&#xff0c;可看到有个cudacodec扩展&#xff0c;用他可方便的进行编解码。唯一麻烦的是需要自行编译opencv。 同时&#xff0c;为了考虑后续方便&#xff0c;顺手编译了FFMPEG&#xff0c;并将其与OPENCV绑定。 在之前的博文“鲲鹏主机昇腾A…

帆软查询按钮,获取组件值。

【查询】按钮增加点击事件&#xff0c;通过_g().parameterEl.getWidgetByName(‘组件名’).getValue(); 获取组件值。 js脚本示例: var bm _g().parameterEl.getWidgetByName(bm).getValue(); if(!bm || bm.length 0 ) {alert ("没有选择部门&#xff0c;查询速度会很…

解决PyCharm安装第三方库时出现“Error updating package list: Connect timed out”问题

在使用PyCharm开发Python项目时&#xff0c;有时会遇到在安装第三方库时出现“Error updating package list: Connect timed out”的错误。这通常是由于网络连接不稳定或PyPI官方源访问速度较慢导致的。为解决此类问题&#xff0c;本文将介绍以下几种策略&#xff1a; 2. 设置P…

【练习】位运算思想

&#x1f3a5; 个人主页&#xff1a;Dikz12&#x1f525;个人专栏&#xff1a;算法(Java)&#x1f4d5;格言&#xff1a;吾愚多不敏&#xff0c;而愿加学欢迎大家&#x1f44d;点赞✍评论⭐收藏 目录 1.判断字符串是否唯一 题目描述 讲解 代码实现 2.丢失的数字 题目描述…

重学Java 12 JavaBean

一、JavaBean的使用 1.标准javaBean JavaBean是Java语言编写类的一种标准规范&#xff0c;符合JavaBean的类&#xff0c;要求&#xff1a; ①类必须是具体的&#xff08;非抽象 abstract&#xff09;和公共的&#xff0c;public class 类名 ②并且具有无参数的构造方法&#x…

C#泛型,利用反射创建和普通创建泛型

泛型,利用反射创建和普通创建 反射 var input Activator.CreateInstance(typeof(Input<>).MakeGenericType(typeof(T))) as dynamic;typeof(T)这个位置可以塞入不同的类型 Activator.CreateInstance 反射动态创建实例&#xff1a; 这种方式使用 Activator.CreateIns…