【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)掌握连续时间系统零状态响应、冲激响应和…...
dedecms 织梦自定义表单留言增加ajax验证码功能
增加ajax功能模块,用户不点击提交按钮,只要输入框失去焦点,就会提前提示验证码是否正确。 一,模板上增加验证码 <input name"vdcode"id"vdcode" placeholder"请输入验证码" type"text&quo…...
【项目实战】通过多模态+LangGraph实现PPT生成助手
PPT自动生成系统 基于LangGraph的PPT自动生成系统,可以将Markdown文档自动转换为PPT演示文稿。 功能特点 Markdown解析:自动解析Markdown文档结构PPT模板分析:分析PPT模板的布局和风格智能布局决策:匹配内容与合适的PPT布局自动…...
Cinnamon修改面板小工具图标
Cinnamon开始菜单-CSDN博客 设置模块都是做好的,比GNOME简单得多! 在 applet.js 里增加 const Settings imports.ui.settings;this.settings new Settings.AppletSettings(this, HTYMenusonichy, instance_id); this.settings.bind(menu-icon, menu…...
python爬虫:Newspaper3k 的详细使用(好用的新闻网站文章抓取和解析的Python库)
更多内容请见: 爬虫和逆向教程-专栏介绍和目录 文章目录 一、Newspaper3k 概述1.1 Newspaper3k 介绍1.2 主要功能1.3 典型应用场景1.4 安装二、基本用法2.2 提取单篇文章的内容2.2 处理多篇文档三、高级选项3.1 自定义配置3.2 分析文章情感四、实战案例4.1 构建新闻摘要聚合器…...
ArcGIS Pro制作水平横向图例+多级标注
今天介绍下载ArcGIS Pro中如何设置水平横向图例。 之前我们介绍了ArcGIS的横向图例制作:ArcGIS横向、多列图例、顺序重排、符号居中、批量更改图例符号等等(ArcGIS出图图例8大技巧),那这次我们看看ArcGIS Pro如何更加快捷的操作。…...
Hive 存储格式深度解析:从 TextFile 到 ORC,如何选对数据存储方案?
在大数据处理领域,Hive 作为 Hadoop 生态中重要的数据仓库工具,其存储格式的选择直接影响数据存储成本、查询效率和计算资源消耗。面对 TextFile、SequenceFile、Parquet、RCFile、ORC 等多种存储格式,很多开发者常常陷入选择困境。本文将从底…...
初探Service服务发现机制
1.Service简介 Service是将运行在一组Pod上的应用程序发布为网络服务的抽象方法。 主要功能:服务发现和负载均衡。 Service类型的包括ClusterIP类型、NodePort类型、LoadBalancer类型、ExternalName类型 2.Endpoints简介 Endpoints是一种Kubernetes资源…...
MySQL 部分重点知识篇
一、数据库对象 1. 主键 定义 :主键是用于唯一标识表中每一行记录的字段或字段组合。它具有唯一性和非空性特点。 作用 :确保数据的完整性,便于数据的查询和管理。 示例 :在学生信息表中,学号可以作为主键ÿ…...
【学习笔记】erase 删除顺序迭代器后迭代器失效的解决方案
目录 使用 erase 返回值继续迭代使用索引进行遍历 我们知道类似 vector 的顺序迭代器被删除后,迭代器会失效,因为顺序迭代器在内存中是连续存储的,元素删除后,后续元素会前移。 但一些场景中,我们又需要在执行删除操作…...
通过MicroSip配置自己的freeswitch服务器进行调试记录
之前用docker安装的freeswitch的,启动是正常的, 但用下面的Microsip连接不上 主要原因有可能一下几个 1、通过下面命令可以看 [rootlocalhost default]# docker exec -it freeswitch fs_cli -x "sofia status profile internal"Name …...
