【MySQL】索引篇

news2024/11/26 17:29:23
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.coloradmin.cn/o/1587623.html

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

相关文章

FPGA基于VCU的H265视频压缩,HDMI2.0输入,支持4K60帧,提供工程源码+开发板+技术支持

目录 1、前言免责声明 2、相关方案推荐我这里已有的视频图像编解码方案 3、详细设计方案设计框图FPGA开发板视频输入Video PHY ControllerHDMI 1.4/2.0 Receiver SubsystemVideo Processing SubsystemVideo Frame Buffer WriteZynq UltraScale VCUPetaLinux 系统制作VLC播放器工…

ElasticSearch的数据同步【Java实现】

文章目录 1、思路分析1.1、同步调用1.2、异步通知1.3、监听binlog1.4、如何选择 2、实现数据同步2.1、思路2.2、demo2.3、声明交换机、队列1&#xff09;引入依赖2&#xff09;声明队列交换机名称3&#xff09;声明队列交换机 2.4、发送MQ消息2.5、接收MQ消息 3、代码链接分享 …

Quartz + SpringBoot 实现分布式定时任务

文章目录 前言一、分布式定时任务解决方案二、Quartz是什么&#xff1f;1.quartz简介2.quartz的优缺点 二、Quartz分布式部署总结 前言 因为应用升级&#xff0c;由之前的单节点微服务应用升级为集群微服务应用&#xff0c;所以之前的定时任务Spring Scheduled不再适用了&…

蓝桥备赛——组合数、其他技巧

对字符串进行permutations排列组合 from itertools import permutations a abc #对字符串进行permutations排列组合 for i in permutations(a,3):x .join(i)print (x,end ) print (\n------------------------------------) permutations后面的参数&#xff0c;第一个表示…

Canal 扩展篇

1.Canal介绍 GitHub - alibaba/canal: 阿里巴巴 MySQL binlog 增量订阅&消费组件 Canal 主要用途是基于 MySQL 数据库增量日志解析&#xff0c;提供增量数据订阅和消费&#xff0c;工作原理如下&#xff1a; Canal 模拟 MySQL slave 的交互协议&#xff0c;伪装自己为 M…

【原创】springboot+mysql宠物管理系统设计与实现

个人主页&#xff1a;程序猿小小杨 个人简介&#xff1a;从事开发多年&#xff0c;Java、Php、Python、前端开发均有涉猎 博客内容&#xff1a;Java项目实战、项目演示、技术分享 文末有作者名片&#xff0c;希望和大家一起共同进步&#xff0c;你只管努力&#xff0c;剩下的交…

Redis(二十)五大经典类型源码

文章目录 面试题源码核心Redis基本的数据结构(骨架)Redis数据库的实现Redis服务端和客户端实现其他 K-V实现怎样实现键值对(key-value)数据库的传统五大基本数据类型和新五大数据类型 5大数据结构底层C语言源码分析示例redisObject五大数据结构解析定义Debug Object keyString …

01 SQL基础 -- 初识数据库与安装

一、初识数据库 数据库是将大量数据保存起来,通过计算机加工而成的可以进行高效访问的数据集合。该数据集合称为数据库(Database, DB)。用来管理数据库的计算机系统称为数据库管理系统(Database Management System, DBMS) 1.1 DBMS 的种类 DBMS 主要通过数据的保存格式…

【WEEK7】 【DAY3】JDBC—数据库驱动【中文版】

2024.4.10 Wednesday 目录 10.JDBC10.1.数据库驱动10.1.1.驱动10.1.2.JDBC10.1.3.第一个JDBC程序10.1.3.1.创建一个普通项目10.1.3.2.导入数据库驱动10.1.3.3.编写测试代码10.1.3.4.DriverManager10.1.3.5.URL10.1.3.6.Connection10.1.3.7.Statement执行SQL的对象10.1.3.8.Res…

[大模型]Atom-7B-chat网页例子

# Atom-7B-chat## 环境准备在[autodl](https://www.autodl.com/)平台中租一个3090等24G显存的显卡机器&#xff0c;如下图所示镜像选择PyTorch-->2.0.0-->3.8(ubuntu20.04)-->11.8![Alt text](images/image-1.png)接下来打开刚刚租用服务器的JupyterLab&#xff0c;并…

Codeforces Round 937 (Div. 4)(A~E)

A. Stair, Peak, or Neither? 根据题意来就可以了 #include <bits/stdc.h> using namespace std;void solve(){int a,b,c;cin>>a>>b>>c;if(a<b and b<c){cout<<"STAIR"<<endl;}else if(a<b and b>c){cout<<…

Docker部署SpringBoot+Vue前后端分离项目

文章目录 1. 安装Docker1. 1 卸载旧版Docker1.2 配置yum仓库1.3 安装Docker1.4 添加自启动配置1.5 配置阿里云镜像加速1.6 测试 2. 安装Nginx2.1 拉取镜像2.2 安装Nginx2.3 测试 3. 安装MySQL3.1 拉取镜像3.2 安装MySQL3.3 连接MySQL 4. 部署SpringBoot项目4.1 Maven打包4.2 编…

算法——栈

. - 力扣&#xff08;LeetCode&#xff09; 给你一个以字符串表示的非负整数 num 和一个整数 k &#xff0c;移除这个数中的 k 位数字&#xff0c;使得剩下的数字最小。请你以字符串形式返回这个最小的数字。 class Solution { public:string removeKdigits(string num, int k…

LeetCode-热题100:64. 最小路径和

题目描述 给定一个包含非负整数的 m x n 网格 grid &#xff0c;请找出一条从左上角到右下角的路径&#xff0c;使得路径上的数字总和为最小。 **说明&#xff1a;**每次只能向下或者向右移动一步。 示例 1&#xff1a; 输入&#xff1a; grid [[1,3,1],[1,5,1],[4,2,1]]…

二叉树:小红的完全二叉树构造

题目描述 小红想构造一个总共 n 个节点完全二叉树&#xff0c;该二叉树满足以下两个性质&#xff1a; 1. 所有节点的权值值为 1 ~ n 的一个排列。 2. 除了根节点以外&#xff0c;每个节点的权值和它父亲的权值的乘积为偶数。 请你帮小红构造出这个二叉树&#xff0c;并按层序遍…

Handler——小白能懂的原理,老鸟需要的面经

1.机制学习 1.1Handler定义 发送并处理 与线程的消息队列关联的Message和Runnable 1.2基本用法 1、Message.obtain() 从消息池取得Message 2、Handler().sendMessage(msg) 发送消息 3、Handler().post 将Runnable包装成Message发送 以下提供一个结构代码 import android.os.H…

嵌入式linux系统链接腾讯云的方法

各位开发者大家好,今天主要给大家分享一个,如何使用linux系统链接腾讯云的方法,因为微信小程序越来越普遍,链接腾讯云也是日常必须掌握的一个技能。 第一:【实验目的】 1、linux 系统连接腾讯云的方法 第二:【实验原理】 涉及到原理图添加原理图 2、linux开发板 …

AI 助力问题驱动式学习

文章概括&#xff1a; AI 已经带来学习方式的改变&#xff0c;降低了我们学习知识的难度&#xff0c;加快了我们解决问题的速度。 本文介绍如何通过 AI 工具&#xff0c;通过直接对大模型、对 Agent、对文档、对知识库提问的方式&#xff0c;快速学习知识快速解决问题等。 本…

Vue3学习03 pinia

Vue3学习 pinia pinia一个简单效果搭建 pinia 环境存储读取数据示例 修改数据 (三种方式)storeToRefsgetters$subscribestore组合式写法 pinia 在vue2中使用vuex&#xff0c;在vue3中使用pinia。 集中式状态管理&#xff0c;&#xff08;状态数据&#xff09;。多个组件共享数…

vue简单使用二(循环)

目录 属性绑定 if判断&#xff1a; for循环&#xff1a; 属性绑定 代码的形式来说明 三元表达式的写法&#xff1a; if判断&#xff1a; for循环&#xff1a; 完整代码&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"…