MySQL-----索引

news2024/11/28 0:59:05

一  概述

        索引(index)是帮助MysQL高效获取数据的数据结构(有序)。在数据之外,数据库系统还维护着满足特定查找算法的数据结构,

        这些数据结构以某种方式引用(指向)数据,这样就可以在这些数据结构上实现高级查找算法,这种数据结构就是索引。

假如表中没有索引的查询情况:

select * from user where age = 45

执行select语句之后,它会从第一条记录开始依次向下查询匹配,当找到符合条件的记录7号时,它会继续向下查找直到将整个表的记录查询匹配完毕,这种查询称为全表扫描,性能十分的低。

假如有索引的查询情况:

数据结构二叉树,查询age=45的记录,查询的方法,首先将age=45与结点36比对,发现比36大,走右边,然后与48比较,比48小,走左侧,最后找到age=4的记录。找到45以后通过索引建立的二叉树,找到指向的数据。显然,有索引的只需要匹配3次就定位到了数据,搜索效率十分高效。

二  索引结构

MySQL的索引是在存储引擎层实现的,不同的存储引擎有不同的结构,主要包含以下几种:

在不同存储引擎中对索引的支持

我们平常所说的索引,如果没有特别指明,都是指B+树结构组织的索引。

2-1 Btree索引结构

首先我们现了解一下二叉树

上图二叉树:一个结点最后只能有两个子节点,左侧的结点比根结点小,右侧的结点比根结点大。比如我们查找数据20:与36比较比36小走左侧,在与22比较比22小,走左侧,在于19大走右侧,最终找到数据记录20.

如果维护二叉树时是顺序插入,最终形成一个单向链表,如果我们要查找17,那么就会把整个链表走一次。

弊端:二叉树缺点:顺序插入时,会形成一个链表,查询性能大大降低。大数据量情况下,层级较深,检索速度慢。

解决链表的顺序插入我们可以使用红黑树,但是红黑树也是一个二叉树,大数据量的情况下,层级较深,检索熟读仍然慢。

B-Tree树

上面的红黑树虽然解决了,顺序插入的问题,但是仍然不能满足大量的数据,如果我们一个结点下面,跟多个结点,那么就可以提升查询的效率。

以一颗最大度数(max-degree)为5(5阶)的b-tree为例(每个节点最多存储4个key,5个指针):

模拟B-Tree树的形成:

 Data Structure Visualization

插入100 65 169 368 900 556 780 35 215 1200 234 888 158 90 1000 88 120 268 250数据为例。

2-2 B+Tree树

以一颗最大度数(max-degree)为4(4阶)的b+tree为例:

  • 观察可以发现所有的元素都会出现在叶子结点,上面的非叶子结点主要起到索引作用。
  • 在B+树中所有的叶子结点形成了一个单向链表。

模拟B+树的形成:

插入100 65 169 368 900 556 780 35  215  1200  234  888  158  90  1000  88 120 268 250数据为例。

MySQL索引数据结构对经典的B+Tree进行了优化。在原B+Tree的基础上,增加一个指向相邻叶子节点的链表指针,就形成了带有顺序指针的B+Tree,提高区间访问的性能。

2-3 Hash结构

哈希索引就是采用一定的hash算法,将键值换算成新的hash值,映射到对应的槽位上,然后存储在hash表中。

比如上面的我们通过每一个人名name,通过我们的hash算法得到槽位值,然后在这个槽位中存放这个key(name)以及地址值。当有多个key指向一个槽位时,会产生hash冲突,我们可以通过链表来解决,在一个槽位后面增加一个链表。

特点:

  1. hash索引只能用于对等比较(=,in),不支持范围查询(between,>,<,...)
  2. 无法利用索引完成排序操作
  3. 查询效率高,通常只需要一次检索就可以了,效率高于B+tree索引

在MysQL中,支持hash索引的是Memory引擎,而innoDB中具有自适应hash功能,hash索引是存储引擎根据B+Tree索引在指定条件下自动构建的。

为什么InnoDB存储引擎选择使用B+tree索引结构?

  • 相对于二叉树,层级更少,搜索效率高
  • 对于B-tree,无论叶子结点还是非叶子结点,都会保存数据,这样导致一页中存储的键值减少,指针跟着减少,要同样保存大量数据,只能增加树的高度,导致性能降低。
  • 相对Hash索引,B+tree支持范围收索以及排序操作。

三  索引分类

在InnoDB存储索引中,更据索引的存储形式,又可以分为以下两种:

聚集索引的选取规则:
如果存在主键,主键索引就是聚集索引

如果不存在主键,将使用第一个唯一索引作为聚集索引

如果表没有主键,或没有合适的唯一索引,则InnoDB会自动生成一个rowid作为隐藏的聚集索引。

执行SQL语句,首先我们会通过二级索引,查找到Arm的id为10,然后通过聚集索引查找到id为10对应的行的数据内容。这种查询我们称为回表查询。

四   索引的语法

-- 创建索引
create [UNIQUE | FULLTEXT ] INDEX index_name ON table_name(index_col_name,..)
-- 查看索引
SHOW INDEX FROM table_name;
-- 删除索引
Drop INDEX index_name ON table_name

首先我们已经有了一个tb_user表,在此基础上我们来实现创建索引的操作。

创建索引 

五   SQL性能分析

5-1 查看执行频率

SQL执行频率

MySQL 客户端连接成功后,通过 show [session|global] status 命令可以提供服务器状态信息。通过如下指令,可以查看当前数据库的INSERT、UPDATE、DELETE、SELECT的访问频次:

--  session 是查看当前会话 ;
--   global 是查询全局数据 ;

Com_delete: 删除次数
Com_insert: 插入次数
Com_select: 查询次数
Com_update: 更新次数
我们可以在当前数据库再执行几次查询操作,然后再次查看执行频次,看看 Com_select 参数会不会 变化。
通过上述指令,我们可以查看到当前数据库到底是以查询为主,还是以增删改为主,从而为数据
库优化提供参考依据。 如果是以增删改为主,我们可以考虑不对其进行索引的优化。 如果是以
查询为主,那么就要考虑对数据库的索引进行优化了。

5-2   慢日志查询

慢查询日志记录了所有执行时间超过指定参数(long_query_time,单位:秒,默认10秒)的所有SQL语句的日志。

MySQL的慢查询日志默认没有开启,我们可以查看一下系统变量 slow_query_log。

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

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

相关文章

Sketch3D:用于草图到3D生成的样式一致性指南

Sketch3D: Style-Consistent Guidance for Sketch-to-3D Generation Sketch3D&#xff1a;用于草图到3D生成的样式一致性指南 Wangguandong Zheng 重试 错误原因 Southeast UniversityChina 重试 错误原因 wgdzhengseu.edu.cnHaifeng Xia 重试 错误原因 Southeast Universit…

千视电子携NDI 6前沿技术,亮相北京CCBN展呈现轻量化媒体解决方案

千视携NDI 6技术闪耀2024 CCBN展会&#xff0c;呈现轻量化媒体解决方案 2024年4月24日至26日&#xff0c;北京首钢会展中心将举办第三十届中国国际广播电视网络技术展览会&#xff08;CCBN2024&#xff09;。这是中国广播电视行业的一项重要盛会&#xff0c;将有国内外超600家…

Apache——DBUtils

韩顺平 零基础30天学会Java 一、基本介绍 1、commons-dbutils是 Apache 组织提供的一个开源JDBC工具类库&#xff0c;它是对JDBC的封装&#xff0c;使用dbutils能极大简化jdbc编码的工作量 二、DbUtils类 1、QueryRunner类&#xff1a;该类封装了SQL的执行&#xff0c;是线程…

Python处理PDF:在PDF文档中插入页眉和页脚

在处理篇幅较长、结构复杂的PDF文档时&#xff0c;页眉和页脚的设计与插入就显得尤为重要。它们不仅扮演着美化文档、提升专业度的角色&#xff0c;更承担了导航指引、信息标注的重要功能。 页眉通常用于展示文档的标题或章节名称&#xff0c;有助于读者在翻阅过程中迅速定位所…

网工基础协议——IP地址

IP地址的概念&#xff1a; IP 地址是我们进行TCP/IP通讯的基础&#xff0c;每个连接到网络上的计算机都必须有一个!P地址。我们目前使用的IP地址是32位的&#xff0c;通常以点分十进制表示。例如:192.168.0.181。IP地址的格式为: IP地址 网络地址 主机地址 或者 |P地址主机地…

真正的检索高手,为什么可以“不检索”?还摸鱼| 秘塔AI

开篇震撼&#xff1a;揭秘秘塔AI搜索的革命性力量 在信息爆炸的时代&#xff0c;如何快速准确地找到所需信息成为了一项挑战。国际上的AI驱动搜索引擎Perplexity以其整合网络最新资讯的能力&#xff0c;为用户提供精确且权威的答案&#xff0c;显著提高了信息检索效率。 而今…

【简明图文教程】Node.js的下载、安装、环境配置及测试

文章目录 前言下载Node.js安装Node.js配置Node.js配置环境变量测试后言 前言 本教程适用于小白第一次从零开始进行Node.js的下载、安装、环境配置及测试。 如果你之前已经安装过了Node.js或删除掉了Node.js想重新安装&#xff0c;需要先参考以下博客进行处理后&#xff0c;再根…

Python 基于 OpenCV 视觉图像处理实战 之 OpenCV 简单视频处理实战案例 之九 简单视频卡通画效果

Python 基于 OpenCV 视觉图像处理实战 之 OpenCV 简单视频处理实战案例 之九 简单视频卡通画效果 目录 Python 基于 OpenCV 视觉图像处理实战 之 OpenCV 简单视频处理实战案例 之九 简单视频卡通画效果 一、简单介绍 二、简单视频卡通画效果实现原理 三、简单视频卡通画效果…

YOLOv8改进 | 检测头篇 | 自研超分辨率检测头HATHead助力超分辨率检测(混合注意力变换器检测头)

一、本文介绍 本文给大家带来的改进机制是由由我本人利用HAT注意力机制&#xff08;超分辨率注意力机制&#xff09;结合V8检测头去掉其中的部分内容形成一种全新的超分辨率检测头。混合注意力变换器&#xff08;HAT&#xff09;的设计理念是通过融合通道注意力和自注意力机制…

记录一个Kafka客户端Offset Explore连不上的问题

我昨天把集群重装了一下&#xff0c;再连这个工具就连不上了&#xff08;你先把zk和kafka在集群启起来&#xff09;&#xff0c;报错截图如下&#xff1a; 英文翻译过来大概就是说遍历zk指定路径不存在&#xff0c;我还以为zk的问题&#xff0c;回去又把zk的文档翻了一遍&#…

物联网实战--驱动篇之(七)RTC时钟(DS1302)

目录 一、RTC简介 二、DS1302介绍 三、初始化 四、字节读写 五、功能函数 一、RTC简介 实时时钟&#xff0c;简称RTC&#xff0c;这个在STM32的外设里也有&#xff0c;不过STM32F1系列的RTC实际上只有一个计数器功能&#xff0c;如果需要年月日要自己写软件计算 &#xff…

C++/QT 医院信息管理系统

一、项目介绍 &#xff08;1&#xff09;管理员、居民、医生三个角色登录&#xff1b;居民可注册账号登录&#xff0c;医生由管理员添加&#xff0c;管理员权限最高 &#xff08;2&#xff09;管理员&#xff1a; 模块一&#xff1a;信息管理&#xff08;医生信息管理、医院…

Leetcode算法训练日记 | day23

一、修剪二叉搜索树 1.题目 Leetcode&#xff1a;第 669 题 给你二叉搜索树的根节点 root &#xff0c;同时给定最小边界low 和最大边界 high。通过修剪二叉搜索树&#xff0c;使得所有节点的值在[low, high]中。修剪树 不应该 改变保留在树中的元素的相对结构 (即&#xff…

基于级联H桥的多电平逆变器PWM控制策略的simulink建模与仿真

目录 1.课题概述 2.系统仿真结果 3.核心程序与模型 4.系统原理简介 5.完整工程文件 1.课题概述 级联H桥&#xff08;CHB&#xff09;多电平逆变器是一种通过多个H桥单元级联实现更高电压等级和更高质量输出波形的电力电子转换装置。这种逆变器在高压大功率场合应用广泛&am…

[CTF]使用浏览器firefox插件伪装IP地址

来源&#xff1a;https://jingyan.baidu.com/article/ab0b56306d9890c15bfa7d6a.html 浏览器想必是大家再熟悉不过的东东了&#xff0c;我们会经常使用它访问下载一些页面或文件。但是对于它的更深层次的功能可能就陌生了。比如说一些网站后台会记录我们的IP地址&#xff0c;假…

U盘怎么加密?U盘加密的方法有哪些?

U盘作为一种便携式的存储设备&#xff0c;广泛应用于日常生活和工作中。但由于其易于携带和使用的特性&#xff0c;U盘中的数据也面临着被未经授权访问的风险。因此&#xff0c;对U盘进行加密成为了保护数据安全的重要措施。本文将介绍几种常见的U盘加密方法&#xff0c;帮助用…

5G智慧港口简介(一)

引言 港口作为交通运输的枢纽,在促进国际贸易和地区发展中起着举足轻重的作用,全球贸易中约 90% 的贸易由海运业承载,作业效率对于港口至关重要。在“工业 4.0”、“互联网 +”大发展的时代背景下,港口也在进行数字化、全自动的转型升级。随着全球 5G 技术浪潮的到来,华为…

android android.permission.MANAGE_EXTERNAL_STORAGE使用

android11 及以上版本&#xff0c;如果release版本要读取外部存储公共目录&#xff0c;即sdcard公共目录&#xff0c;需要在androidManifest.xml下申明 <uses-permission android:name"android.permission.MANAGE_EXTERNAL_STORAGE" /> 如果要发版到海外&…

前端对接fastGPT流式数据+打字机效果

首先在对接api时 参数要设置stream: true, const data {chatId: abc,stream: true,//这里true返回流式数据detail: false,variables: {uid: sfdsdf,name: zhaoyunyao,},messages: [{ content: text, role: user }]}; 不要用axios发请求 不然处理不了流式数据 我这里使用fetch …

7.接口自动化测试-Allure报告

1.环境搭建 &#xff08;1&#xff09;下载并解压allure.zip&#xff0c;不要用中文路径&#xff0c;将bin目录配置到path环境变量 官网&#xff1a;Allure下载 &#xff08;2&#xff09;cmd安装allure-pytest第三方库 pip install allure-pytest 检测是否安装成功 pip show …