当前位置: 首页 > news >正文

【MySQL】索引

记录MySQL学习笔记,大部分图片来自黑马程序员MySQL教程。

文章目录

  • 概述
  • 索引结构
    • B+Tree
    • 为什么InnoDB使用B+Tree索引结构?
  • 索引分类
  • 索引语法
  • SQL性能分析
    • 1、查看执行频次
    • 2、慢查询日志
    • 3、profile详情
    • 4、explain执行计划
  • 索引使用
    • 最左前缀法则
    • 索引失效情况
      • 1、范围查询
      • 2、索引列运算
      • 3、字符串不加单引号
      • 4、模糊查询
      • 5、or连接的条件
      • 6、数据分布
    • SQL提示
    • 覆盖索引
    • 前缀索引
    • 单列索引和联合索引
    • 索引设计原则
    • 总结

概述

索引是MySQL高效获取数据的数据结构,这些数据结构利用特定查找算法引用(指向)数据。

优缺点:

优点缺点
提高数据检索效率,降低IO成本需要占用空间
索引列对数据进行排序,降低了数据排序的成本,减少CPU消耗因为更新表的时候也要更新索引,所以降低了更新表的速度

但是现在磁盘很便宜,且正常情况下增删改数据库的频率很小,所以以上劣势可以忽略。

索引结构

MySQL的索引是在存储引擎层实现的,不同的存储引擎有不同的结构,主要的几种结构如下所示。

索引结构描述
B+Tree索引(重点)最常见
Hash索引底层数据结构用哈希表实现,不支持范围查询
R-Tree(空间索引)是MyISAM引擎的一个特殊索引类型,主要用于地理空间数据类型
Full-text(全文索引)一种通过建立倒排索引,快速匹配文档的索引

B+Tree

Q:为什么使用B+树?
A:针对数据库数据量大且其他树形结构的闭端,权衡下采用B+树。

在这里插入图片描述
图片来自黑马程序员MySQL教程。

在这里插入图片描述
中间元素向上分裂

在这里插入图片描述
所有元素都会出现在叶子节点,叶子节点形成一个单向链表。

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

为什么InnoDB使用B+Tree索引结构?

  • 相较于二叉树 (红黑树) ,层级更少,搜索效率高。
  • 对于B树,无论叶子节点还是非叶子节点都会保存数据,而每一个节点都存放在一个页中(页的大小是固定的),这样导致一页中存储的键值减少,指针也跟着减少,所以保存大量数据时,树的高度就会增加,查找性能降低。
  • B+树叶子节点的双向链表便于范围搜索和排序。
  • 相较于哈希索引,B+树支持范围匹配和排序操作。

索引分类

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

聚集索引叶子节点存放数一行数据,二级索引叶子节点存放主键值。
在这里插入图片描述回表查询:先在二级索引当中找到主键值,再根据主键值到聚集索引中找到这一行数据。

在这里插入图片描述
即使存储两千多万行数据,B+树的高度也只有3,所以B+树的效率很高,如果B+树的高度要大于3了,就会用分表解决。

索引语法

在这里插入图片描述

SQL性能分析

1、查看执行频次

在这里插入图片描述
七个下划线,恰好可以代表_delete、_insert、_select、_update。

2、慢查询日志

在这里插入图片描述

通过指令查看

show variables like 'slow_%';

3、profile详情

在这里插入图片描述
在这里插入图片描述

4、explain执行计划

尽量优化type。

但仅当查询不需要访问表时才会出现NULL,只访问系统表才能达到system,所以尽量往const上优化(即使用主键或者唯一索引),当使用非唯一索引的时候 type 是ref,all代表全表扫描,性能最差,index代表用了索引,但遍历了整个索引,性能也不高。

在这里插入图片描述

在这里插入图片描述

索引使用

在这里插入图片描述

最左前缀法则

在这里插入图片描述

  • 若跳过了某一列,则从这一列开始,之后的索引失效。
  • 每一列的使用顺序不影响结果。

索引失效情况

1、范围查询

在这里插入图片描述

  • 解决方法:将 < , > 改为 <= , >=

2、索引列运算

在这里插入图片描述

3、字符串不加单引号

在这里插入图片描述

4、模糊查询

like '计算机科学%' -- 不失效like '%与技术' -- 失效 like '%与%' -- 失效

5、or连接的条件

用or分隔开的条件,如果or之前的条件中的列有索引,而后面的列中没有索引,那么涉及到的索引都不会用到。
在这里插入图片描述
age没有单独建立索引,并且也不是联合索引的第一个,所以查询的时候没有索引。

6、数据分布

如果MySQL评估使用索引比不使用还要慢,则不使用索引。
在这里插入图片描述

  • is null 走不走索引取决于查询的字段中null的个数占总行数的比例。

SQL提示

在这里插入图片描述

  • 用use指定,MySQL会自己评估可能不用,用force指定,系统则只能用这个索引。

覆盖索引

在这里插入图片描述
在这里插入图片描述

  • 找gender的时候需要回表。
  • 使用select * 很容易就会回表查询。

在这里插入图片描述

  • 对username和password建立联合索引,username是第一个,那么查询的时候走联合查询,叶子节点上就是主键id,满足覆盖索引。

前缀索引

在这里插入图片描述

  • 不可能返回一个前缀,所以查询前缀肯定要回表。

单列索引和联合索引

在这里插入图片描述
在这里插入图片描述

索引设计原则

在这里插入图片描述

  • 一张表数据量超过100万就算大,如果不怎么查询,建立索引也没用;

总结

在这里插入图片描述
在这里插入图片描述

相关文章:

【MySQL】索引

记录MySQL学习笔记&#xff0c;大部分图片来自黑马程序员MySQL教程。 文章目录 概述索引结构BTree为什么InnoDB使用BTree索引结构&#xff1f; 索引分类索引语法SQL性能分析1、查看执行频次2、慢查询日志3、profile详情4、explain执行计划 索引使用最左前缀法则索引失效情况1、…...

JavaScript全解析——express

express 的基本使用 ●express 是什么? ○是一个 node 的第三方开发框架 ■把启动服务器包括操作的一系列内容进行的完整的封装 ■在使用之前, 需要下载第三方 ■指令: npm install express 1.基本搭建 // 0. 下载: npm install express// 0. 导入 const express express()…...

【JavaScript数据结构与算法】字符串类(计算二进制子串)

个人简介 &#x1f440;个人主页&#xff1a; 前端杂货铺 &#x1f64b;‍♂️学习方向&#xff1a; 主攻前端方向&#xff0c;也会涉及到服务端&#xff08;Node.js&#xff09; &#x1f4c3;个人状态&#xff1a; 在校大学生一枚&#xff0c;已拿多个前端 offer&#xff08;…...

TCP连接不释放,应用产生大量CLOSE_WAIT状态TCP

一、起源 23年元旦期间&#xff0c;大家都沉浸在一片祥和的过节气氛当中。 “滴滴滴”&#xff0c;这头同事的电话响起&#xff0c;具体说些什么我也没太在意&#xff0c;但见同事接完电话之后展现出了一副懊恼夹杂着些许不耐烦的表情。 我不解问道&#xff1a;“怎么了&…...

Spring基础核心概念理解(常见面试题:什么是IoC?什么是DI?什么是Spring?)

目录 IoC 和 SpringIoC DI Spring IoC 和 SpringIoC IoC是控制反转的意思,它意味着控制权(依赖对象)的反转,将控制权进行反转,它是一种思想. 举个例子,理解一下什么是控制反转 现在有三个对象A,B,C. A的创建依赖于B,B的创建依赖于C,当我们想要创建A的时候创建B,同理也要…...

牛客小白月赛 D.遗迹探险 - DP

题目描述 小Z是一名探险家。有一天&#xff0c;小Z误入了一个魔法遗迹。以下是该遗迹的具体组成&#xff1a; 1. 在 x 轴和 y 轴构成的平面上&#xff0c;满足在 1≤x≤n&#xff0c;1≤y≤m 的区域中(坐标(x,y)表示平面上的第x行的第y列)&#xff0c;每个整数坐标 (x,y) 都有…...

前端架构师-week6-require源码解析

require 源码解析——彻底搞懂 npm 模块加载原理 require 的使用场景 加载模块类型 加载内置模块&#xff1a;require(fs)加载 node_modules 模块&#xff1a;require(ejs)加载本地模块&#xff1a;require(./utils)支持文件类型 加载 .js 文件加载 .mjs 文件加载 .json 文件…...

作为 IT 行业的过来人,你有什么话想对后辈说的?

作为 IT 行业的过来人&#xff0c;我想对后辈们说&#xff0c;要不断学习和探索新技术&#xff0c;但同时也要注意保持专注和耐心。在这个快速变化的时代&#xff0c;技术更新换代太快&#xff0c;可能会让人感到焦虑和无助&#xff0c;但只要有耐心并专注于自己所做的事情&…...

表数据编辑(数据库)

目录 一、插入数据 1&#xff0e;插入单个元组: INSERT…VALUES语句 2&#xff0e;插入子查询的结果: INSERT…SELECT语句 3&#xff0e;使用SELECT…INTO语句进行数据插入 二、修改数据 1、数据修改语句&#xff1a;UPDATE 2、修改给定表的所有行 3、基于给定表修改某…...

考虑多能负荷不确定性的区域综合能源系统鲁棒规划(Python代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…...

RocketMQ整理

RocketMQ在阿里云上的商业版本,集成了阿里内部一些更深层次的功能及运维定制。开源版本,功能上略有缺失,但大体上是一样的。 使用Java开发,便于深度定制。最早叫MetaQ。消息吞吐量虽然依然不如Kafka,但是却比RabbitMQ高很多。在阿里内部,RocketMQ集群每天处理的请求数超过…...

Springboot +Flowable,会签、或签简单使用(二)

一.简介 **会签&#xff1a;**在一个流程中的某一个 Task 上&#xff0c;这个 Task 需要多个用户审批&#xff0c;当多个用户全部审批通过&#xff0c;或者多个用户中的某几个用户审批通过&#xff0c;就算通过。 例如&#xff1a;之前的请假流程&#xff0c;假设这个请假流程…...

将核心交换机配置为NTP服务器

AR配置外源NTP 1&#xff0e;配置ntp <XQ-R1220>sys [XQ-R1220]ntp-service unicast-server 120.25.115.20 #阿里云ntp [XQ-R1220]ntp-service unicast-server 203.107.6.88 #阿里云ntp 2&#xff0e;查看ntp状态 <XQ-R1220>display ntp status clock sta…...

application.properties文件注释

这是一个常用的Spring Boot配置文件 在这里&#xff0c;我们可以配置应用程序的各种属性 服务器端口号 server.port8080 数据库配置 spring.datasource.urljdbc:mysql://localhost:3306/test spring.datasource.usernameroot spring.datasource.password123456 spring.datasou…...

MySql查询报错this is incompatible with sql_mode=only_full_group_by

错误示例 Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggregated column ‘yiliaohaocai_new.a.id’ which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_modeonly_full_group_by 原因 SQL …...

VMware Workstation 网络备忘 + 集群规模

概述 在虚拟机中部署服务&#xff0c;进行IP规划&#xff0c;进行相关的前期准备 3 张网卡 2个不同的网段 1个NAT 概述截图 NAT 截图 VMnet0 截图 VMnet1 截图 总结&#xff1a; 网卡&#xff08;网络适配器&#xff09;名称IP网段备注NATens33192.168.139.0VMnet0ens34VMne…...

被裁现状,给找工作的同学一些建议

2022 到 2023 国内知名互联网公司腾讯、阿里、百度、快手、滴滴、京东、阿里、爱奇艺、知乎、字节跳动、小米等公司均有裁员&#xff0c;其中有不少公司&#xff0c;在过去年的一整年&#xff0c;进行了多轮裁员&#xff0c;以下是网传的一张 “2022 年裁员企业名单”。 这些裁…...

编程到底难在哪里?

编程是一门非常有挑战性的技术&#xff0c;能够让人们使用计算机来完成各种任务。它不仅需要掌握各种计算机语言和框架&#xff0c;还需要在实际应用中充分发挥自己的专业知识和创造力。 然而&#xff0c;对于初学者来说&#xff0c;在编程过程中遇到的难点可能是多方面的。以…...

C++ 仿函数(一)

目录 一、仿函数是什么&#xff1f; 二、仿函数的特点 1.仿函数在使用时&#xff0c;可以像普通函数那样调用, 可以有参数&#xff0c;可以有返回值 2.仿函数超出普通函数的概念&#xff0c;可以有自己的状态 ​编辑3.仿函数可以作为参数传递。 三、谓词 一元谓词示例&a…...

MATLAB连续LTI系统的时域分析(十)

目录 1、实验目的&#xff1a; 2、实验内容&#xff1a; 1、实验目的&#xff1a; 1&#xff09;掌握利用MATLAB对系统进行时域分析的方法&#xff1b; 2&#xff09;掌握连续时间系统零输入响应的求解方法&#xff1b; 3&#xff09;掌握连续时间系统零状态响应、冲激响应和…...

SkyWalking 10.2.0 SWCK 配置过程

SkyWalking 10.2.0 & SWCK 配置过程 skywalking oap-server & ui 使用Docker安装在K8S集群以外&#xff0c;K8S集群中的微服务使用initContainer按命名空间将skywalking-java-agent注入到业务容器中。 SWCK有整套的解决方案&#xff0c;全安装在K8S群集中。 具体可参…...

大数据零基础学习day1之环境准备和大数据初步理解

学习大数据会使用到多台Linux服务器。 一、环境准备 1、VMware 基于VMware构建Linux虚拟机 是大数据从业者或者IT从业者的必备技能之一也是成本低廉的方案 所以VMware虚拟机方案是必须要学习的。 &#xff08;1&#xff09;设置网关 打开VMware虚拟机&#xff0c;点击编辑…...

大语言模型如何处理长文本?常用文本分割技术详解

为什么需要文本分割? 引言:为什么需要文本分割?一、基础文本分割方法1. 按段落分割(Paragraph Splitting)2. 按句子分割(Sentence Splitting)二、高级文本分割策略3. 重叠分割(Sliding Window)4. 递归分割(Recursive Splitting)三、生产级工具推荐5. 使用LangChain的…...

江苏艾立泰跨国资源接力:废料变黄金的绿色供应链革命

在华东塑料包装行业面临限塑令深度调整的背景下&#xff0c;江苏艾立泰以一场跨国资源接力的创新实践&#xff0c;重新定义了绿色供应链的边界。 跨国回收网络&#xff1a;废料变黄金的全球棋局 艾立泰在欧洲、东南亚建立再生塑料回收点&#xff0c;将海外废弃包装箱通过标准…...

大语言模型(LLM)中的KV缓存压缩与动态稀疏注意力机制设计

随着大语言模型&#xff08;LLM&#xff09;参数规模的增长&#xff0c;推理阶段的内存占用和计算复杂度成为核心挑战。传统注意力机制的计算复杂度随序列长度呈二次方增长&#xff0c;而KV缓存的内存消耗可能高达数十GB&#xff08;例如Llama2-7B处理100K token时需50GB内存&a…...

Python Ovito统计金刚石结构数量

大家好,我是小马老师。 本文介绍python ovito方法统计金刚石结构的方法。 Ovito Identify diamond structure命令可以识别和统计金刚石结构,但是无法直接输出结构的变化情况。 本文使用python调用ovito包的方法,可以持续统计各步的金刚石结构,具体代码如下: from ovito…...

省略号和可变参数模板

本文主要介绍如何展开可变参数的参数包 1.C语言的va_list展开可变参数 #include <iostream> #include <cstdarg>void printNumbers(int count, ...) {// 声明va_list类型的变量va_list args;// 使用va_start将可变参数写入变量argsva_start(args, count);for (in…...

Python学习(8) ----- Python的类与对象

Python 中的类&#xff08;Class&#xff09;与对象&#xff08;Object&#xff09;是面向对象编程&#xff08;OOP&#xff09;的核心。我们可以通过“类是模板&#xff0c;对象是实例”来理解它们的关系。 &#x1f9f1; 一句话理解&#xff1a; 类就像“图纸”&#xff0c;对…...

echarts使用graphic强行给图增加一个边框(边框根据自己的图形大小设置)- 适用于无法使用dom的样式

pdf-lib https://blog.csdn.net/Shi_haoliu/article/details/148157624?spm1001.2014.3001.5501 为了完成在pdf中导出echarts图&#xff0c;如果边框加在dom上面&#xff0c;pdf-lib导出svg的时候并不会导出边框&#xff0c;所以只能在echarts图上面加边框 grid的边框是在图里…...

在Zenodo下载文件 用到googlecolab googledrive

方法&#xff1a;Figshare/Zenodo上的数据/文件下载不下来&#xff1f;尝试利用Google Colab &#xff1a;https://zhuanlan.zhihu.com/p/1898503078782674027 参考&#xff1a; 通过Colab&谷歌云下载Figshare数据&#xff0c;超级实用&#xff01;&#xff01;&#xff0…...