【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子句中对索引字段使用函数,这会造成索引失效

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

我的电脑图标没了怎么办?恢复图标只需一分钟!

“我打开电脑后&#xff0c;突然发现我的电脑图标没了&#xff0c;这是为什么呢&#xff1f;有什么方法可以找回我的电脑图标吗&#xff1f;” 在日常使用电脑的过程中&#xff0c;电脑桌面的各个图标是保证我们能正常打开应用的前提。我的电脑图标没了怎么办&#xff1f;这可能…

zabbix升级后图形文字不显示

原版本升级后版本6.4.76.4.13 问题现象 更新小版本后zabbix数据图形都有&#xff0c;只有下方文字不显示 处理方式 下载win字体&#xff0c;根据自己选择&#xff0c;上传至/usr/share/zabbix/assets/fonts目录下&#xff0c;修改文件名为jianti.ttf 修改默认字体配置文件…

CSS导读 (元素显示模式 上)

&#xff08;大家好&#xff0c;今天我们将继续来学习CSS的相关知识&#xff0c;大家可以在评论区进行互动答疑哦~加油&#xff01;&#x1f495;&#xff09; 目录 三、CSS的元素显示模式 3.1 什么是元素显示模式 3.2 块元素 3.3 行内元素 3.4 行内块元素 3.5 元素…

HashMap扩容原理(带源码分析)

HashMap的扩容原理 1.扩容流程图 注&#xff1a;拆分链表的规则 这里拆分链表时的一个比较&#xff1a;e.hash & oldCap 0 意思是&#xff1a;某一个节点的hash值和老数组容量求&运算。如果等于0&#xff0c;当前元素在老数组中的位置就是在新数组中的位置。如果不等…

CORS 跨域问题解决预检(OPTIONS)请求解释

场景&#xff1a; 业务要求从把系统B嵌入到系统A中&#xff0c;系统A和系统B是完成不同的两个域名&#xff0c;前端同事完成系统嵌入后&#xff0c;从A系统内部调用B系统的接口时候发现跨域错误&#xff08;CORS error&#xff09;&#xff0c;如下&#xff1a; 什么是跨域&…

vscode开发 vue3+ts 的 uni-app 微信小程序项目

创建uni-app项目&#xff1a; # 创建用ts开发的uni-app npx degit dcloudio/uni-preset-vue#vite-ts 项目名称 # 创建用js开发的uni-app npx degit dcloudio/uni-preset-vue#vite 项目名称VS Code 配置 为什么选择 VS Code &#xff1f; HbuilderX 对 TS 类型支持暂不完善VS…

(学习日记)2024.04.16:UCOSIII第四十四节:内存管理

写在前面&#xff1a; 由于时间的不足与学习的碎片化&#xff0c;写博客变得有些奢侈。 但是对于记录学习&#xff08;忘了以后能快速复习&#xff09;的渴望一天天变得强烈。 既然如此 不如以天为单位&#xff0c;以时间为顺序&#xff0c;仅仅将博客当做一个知识学习的目录&a…

手机数据恢复工具

下载地址&#xff1a;手机数据恢复工具.zip Android/HarmonyOS 文件误删是日常使用电子设备时经常遇到的问题&#xff0c;也许一不小心就就可能会误删。 俗话说&#xff1a;数据无价&#xff0c;一但想要找回一些被删除的文件&#xff0c;就需要耗费大量的精力和财力来恢复文…

【宝德PI300T G2智能小站开发教程(三)】centos配置系统开发源

目录 一.前言 二.配置dns服务器 三.测试连通性 四.设置更新源文件 一.前言 openeular系统的宝德板子没有更新的国内源,要如何配置? 二.配置dns服务器 vi /etc/resolv.conf 添加如下内容: nameserver 8.8.8.8 nameserver 114.114.114.114 三.测试连通性 ping www.ba…

vscode远程连接centos

文章目录 vacode连接linux1. 安装插件2. 查看配置3. 打开ssh4. 远程连接 vacode连接linux 1. 安装插件 在扩展栏搜索remote &#xff0c;找到Remote Development插件&#xff0c;进行安装&#xff1a; 2. 查看配置 打开自己的linux终端&#xff0c;输入ifconfig&#xff0c;…

Laravel/Lumen 中使用 Echo + Socket.IO-Client 实现网页即时通讯广播

此处以 Lumen 9 框架为例说明如何调试通过 Echo 服务端以及客户端 如果你是 Laravel/Lumen 10.47 用户&#xff0c;可以先了解官方的 Laravel Reverb。注意 Laravel Reverb 仅支持 Laravel/Lumen 10.47 以及 PHP 8.2Laravel Reverb 参考官网&#xff1a;https://laravel.com/d…

CSS导读 (复合选择器 下)

&#xff08;大家好&#xff0c;今天我们将继续来学习CSS的相关知识&#xff0c;大家可以在评论区进行互动答疑哦~加油&#xff01;&#x1f495;&#xff09; 目录 2.5 伪类选择器 2.6 链接伪类选择器 2.6.1 链接伪类注意事项 2.6.2 链接伪类选择器实际开发中的写法 2.7 …

智慧医疗app

智慧医疗app是一套融合物联网、云计算和大数据等技术&#xff0c;以患者数据为中心的医疗服务模式&#xff0c;致力于为患者提供更加便捷、高效的医疗服务。 在线挂号、在线问诊、电子病历记录、健康管理以及药品购买等。患者可以通过app选择医生和挂号时间&#xff0c;并在线…

ROS2从入门到精通1-3:详解ROS2动作通信机制与自定义动作

目录 0 专栏介绍1 动作通信模型2 动作模型实现(C)3 动作模型实现(Python)4 自定义动作 0 专栏介绍 本专栏旨在通过对ROS2的系统学习&#xff0c;掌握ROS2底层基本分布式原理&#xff0c;并具有机器人建模和应用ROS2进行实际项目的开发和调试的工程能力。 &#x1f680;详情&a…

蓝桥杯嵌入式2021年第十二届第一场省赛主观题解析

1 题目 2 代码 /* USER CODE END Header */ /* Includes ------------------------------------------------------------------*/ #include "main.h" #include "tim.h" #include "usart.h" #include "gpio.h"/* Private includes…

武汉星起航助力跨境电商,专业选品与全方位服务引领行业新风尚

在全球跨境电商浪潮的推动下&#xff0c;越来越多的卖家纷纷将目光投向了这片广阔的市场。然而&#xff0c;如何在这片蓝海中脱颖而出&#xff0c;成为众多卖家关注的焦点。武汉星起航电子商务有限公司以其专业的选品建议和全方位的服务&#xff0c;为卖家们提供了一条成功的捷…

新零售行业门店管理方案详解,人人都可以是好店长

在之前的文章中&#xff0c;我们分别介绍了新零售业的全面解决方案&#xff0c;包括门店管理解决方案、商品经营方案、会员管理解决方案&#xff0c;以及这些方案所包含的分析指标&#xff0c;吸引了不少对新零售转型感兴趣的企业主。 后续我们会将这些内容拆解开来&#xff0…

LeetCode-热题100:104. 二叉树的最大深度

题目描述 给定一个二叉树 root &#xff0c;返回其最大深度。 二叉树的 最大深度 是指从根节点到最远叶子节点的最长路径上的节点数。 示例 1&#xff1a; 输入&#xff1a; root [3,9,20,null,null,15,7] 输出&#xff1a; 3 示例 2&#xff1a; 输入&#xff1a; root …

【数字IC/FPGA】什么是无符号数?什么是有符号数?

进制 虽然在日常生活中&#xff0c;我们已经习惯了使用10进制数字&#xff0c;但在由数字电路构成的数字世界中&#xff0c;2进制才是效率更高的选择。 10进制与2进制 10进制&#xff08;decimal&#xff09;计数法&#xff08;一般也叫阿拉伯计数法&#xff09;是在日常生活…

LLM生成模型在生物单细胞single cell的应用:scGPT

参考&#xff1a; https://github.com/bowang-lab/scGPT https://www.youtube.com/watch?vXhwYlgEeQAs 主要是把单细胞测序出来的基因表达量的拼接起来构建成的序列&#xff0c;这里不是用的基因的ATCG&#xff0c;是直接用的基因名称 训练数据&#xff1a;scGPT全人模型是在3…