【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学习笔记,大部分图片来自黑马程序员MySQL教程。 文章目录 概述索引结构BTree为什么InnoDB使用BTree索引结构? 索引分类索引语法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数据结构与算法】字符串类(计算二进制子串)
个人简介 👀个人主页: 前端杂货铺 🙋♂️学习方向: 主攻前端方向,也会涉及到服务端(Node.js) 📃个人状态: 在校大学生一枚,已拿多个前端 offer(…...
TCP连接不释放,应用产生大量CLOSE_WAIT状态TCP
一、起源 23年元旦期间,大家都沉浸在一片祥和的过节气氛当中。 “滴滴滴”,这头同事的电话响起,具体说些什么我也没太在意,但见同事接完电话之后展现出了一副懊恼夹杂着些许不耐烦的表情。 我不解问道:“怎么了&…...
Spring基础核心概念理解(常见面试题:什么是IoC?什么是DI?什么是Spring?)
目录 IoC 和 SpringIoC DI Spring IoC 和 SpringIoC IoC是控制反转的意思,它意味着控制权(依赖对象)的反转,将控制权进行反转,它是一种思想. 举个例子,理解一下什么是控制反转 现在有三个对象A,B,C. A的创建依赖于B,B的创建依赖于C,当我们想要创建A的时候创建B,同理也要…...
牛客小白月赛 D.遗迹探险 - DP
题目描述 小Z是一名探险家。有一天,小Z误入了一个魔法遗迹。以下是该遗迹的具体组成: 1. 在 x 轴和 y 轴构成的平面上,满足在 1≤x≤n,1≤y≤m 的区域中(坐标(x,y)表示平面上的第x行的第y列),每个整数坐标 (x,y) 都有…...
前端架构师-week6-require源码解析
require 源码解析——彻底搞懂 npm 模块加载原理 require 的使用场景 加载模块类型 加载内置模块:require(fs)加载 node_modules 模块:require(ejs)加载本地模块:require(./utils)支持文件类型 加载 .js 文件加载 .mjs 文件加载 .json 文件…...
作为 IT 行业的过来人,你有什么话想对后辈说的?
作为 IT 行业的过来人,我想对后辈们说,要不断学习和探索新技术,但同时也要注意保持专注和耐心。在这个快速变化的时代,技术更新换代太快,可能会让人感到焦虑和无助,但只要有耐心并专注于自己所做的事情&…...
表数据编辑(数据库)
目录 一、插入数据 1.插入单个元组: INSERT…VALUES语句 2.插入子查询的结果: INSERT…SELECT语句 3.使用SELECT…INTO语句进行数据插入 二、修改数据 1、数据修改语句:UPDATE 2、修改给定表的所有行 3、基于给定表修改某…...
考虑多能负荷不确定性的区域综合能源系统鲁棒规划(Python代码实现)
💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…...
RocketMQ整理
RocketMQ在阿里云上的商业版本,集成了阿里内部一些更深层次的功能及运维定制。开源版本,功能上略有缺失,但大体上是一样的。 使用Java开发,便于深度定制。最早叫MetaQ。消息吞吐量虽然依然不如Kafka,但是却比RabbitMQ高很多。在阿里内部,RocketMQ集群每天处理的请求数超过…...
Springboot +Flowable,会签、或签简单使用(二)
一.简介 **会签:**在一个流程中的某一个 Task 上,这个 Task 需要多个用户审批,当多个用户全部审批通过,或者多个用户中的某几个用户审批通过,就算通过。 例如:之前的请假流程,假设这个请假流程…...
将核心交换机配置为NTP服务器
AR配置外源NTP 1.配置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.查看ntp状态 <XQ-R1220>display ntp status clock sta…...
application.properties文件注释
这是一个常用的Spring Boot配置文件 在这里,我们可以配置应用程序的各种属性 服务器端口号 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 网络备忘 + 集群规模
概述 在虚拟机中部署服务,进行IP规划,进行相关的前期准备 3 张网卡 2个不同的网段 1个NAT 概述截图 NAT 截图 VMnet0 截图 VMnet1 截图 总结: 网卡(网络适配器)名称IP网段备注NATens33192.168.139.0VMnet0ens34VMne…...
被裁现状,给找工作的同学一些建议
2022 到 2023 国内知名互联网公司腾讯、阿里、百度、快手、滴滴、京东、阿里、爱奇艺、知乎、字节跳动、小米等公司均有裁员,其中有不少公司,在过去年的一整年,进行了多轮裁员,以下是网传的一张 “2022 年裁员企业名单”。 这些裁…...
编程到底难在哪里?
编程是一门非常有挑战性的技术,能够让人们使用计算机来完成各种任务。它不仅需要掌握各种计算机语言和框架,还需要在实际应用中充分发挥自己的专业知识和创造力。 然而,对于初学者来说,在编程过程中遇到的难点可能是多方面的。以…...
C++ 仿函数(一)
目录 一、仿函数是什么? 二、仿函数的特点 1.仿函数在使用时,可以像普通函数那样调用, 可以有参数,可以有返回值 2.仿函数超出普通函数的概念,可以有自己的状态 编辑3.仿函数可以作为参数传递。 三、谓词 一元谓词示例&a…...
MATLAB连续LTI系统的时域分析(十)
目录 1、实验目的: 2、实验内容: 1、实验目的: 1)掌握利用MATLAB对系统进行时域分析的方法; 2)掌握连续时间系统零输入响应的求解方法; 3)掌握连续时间系统零状态响应、冲激响应和…...
SkyWalking 10.2.0 SWCK 配置过程
SkyWalking 10.2.0 & SWCK 配置过程 skywalking oap-server & ui 使用Docker安装在K8S集群以外,K8S集群中的微服务使用initContainer按命名空间将skywalking-java-agent注入到业务容器中。 SWCK有整套的解决方案,全安装在K8S群集中。 具体可参…...
大数据零基础学习day1之环境准备和大数据初步理解
学习大数据会使用到多台Linux服务器。 一、环境准备 1、VMware 基于VMware构建Linux虚拟机 是大数据从业者或者IT从业者的必备技能之一也是成本低廉的方案 所以VMware虚拟机方案是必须要学习的。 (1)设置网关 打开VMware虚拟机,点击编辑…...
大语言模型如何处理长文本?常用文本分割技术详解
为什么需要文本分割? 引言:为什么需要文本分割?一、基础文本分割方法1. 按段落分割(Paragraph Splitting)2. 按句子分割(Sentence Splitting)二、高级文本分割策略3. 重叠分割(Sliding Window)4. 递归分割(Recursive Splitting)三、生产级工具推荐5. 使用LangChain的…...
江苏艾立泰跨国资源接力:废料变黄金的绿色供应链革命
在华东塑料包装行业面临限塑令深度调整的背景下,江苏艾立泰以一场跨国资源接力的创新实践,重新定义了绿色供应链的边界。 跨国回收网络:废料变黄金的全球棋局 艾立泰在欧洲、东南亚建立再生塑料回收点,将海外废弃包装箱通过标准…...
大语言模型(LLM)中的KV缓存压缩与动态稀疏注意力机制设计
随着大语言模型(LLM)参数规模的增长,推理阶段的内存占用和计算复杂度成为核心挑战。传统注意力机制的计算复杂度随序列长度呈二次方增长,而KV缓存的内存消耗可能高达数十GB(例如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 中的类(Class)与对象(Object)是面向对象编程(OOP)的核心。我们可以通过“类是模板,对象是实例”来理解它们的关系。 🧱 一句话理解: 类就像“图纸”,对…...
echarts使用graphic强行给图增加一个边框(边框根据自己的图形大小设置)- 适用于无法使用dom的样式
pdf-lib https://blog.csdn.net/Shi_haoliu/article/details/148157624?spm1001.2014.3001.5501 为了完成在pdf中导出echarts图,如果边框加在dom上面,pdf-lib导出svg的时候并不会导出边框,所以只能在echarts图上面加边框 grid的边框是在图里…...
在Zenodo下载文件 用到googlecolab googledrive
方法:Figshare/Zenodo上的数据/文件下载不下来?尝试利用Google Colab :https://zhuanlan.zhihu.com/p/1898503078782674027 参考: 通过Colab&谷歌云下载Figshare数据,超级实用!!࿰…...
