N天爆肝数据库——MySQL(5)

news2024/9/23 9:24:55

本文主要对索引进行了讲解

这里写目录标题

    • 本文主要对索引进行了讲解
      • 索引概述
        • 介绍
        • 优缺点
        • 索引结构
          • 二叉树
          • 红黑树
          • B-Tree(多路平衡查找树)
          • B+Tree
            • B+Tree与B-Tree区别:
          • Hash
            • Hash索引特点
          • 为什么InnoDB存储引擎选择使用B+Tree索引结构?
          • 索引分类
          • 在InnoDB存储引擎中,根据索引的存储形式,又可以分为以下两种:
          • 聚集索引选取规则
        • 索引语法
          • 创建索引
          • 查看索引
          • 删除索引
      • SQL性能分析
        • SQL执行频率
        • 慢查询日志
        • profile详情
      • explain执行计划
        • 语法
        • EXPLAIN执行计划各字段含义:

在这里插入图片描述

索引概述

介绍

索引是帮助MySQL高效获取数据的数据结构(有序)。在数据之外,数据库系统
还维护着满足特定查找算法的数据结构,这些数据结构以魔种方式引用(指向)
数据。这样就可以在这些数据结构上实现高级查找算法,这种数据结构就是索引。

优缺点

 优点:提高数据检索的效率,降低数据库的IO成本。
    通过索引列对数据进行排序,降低数据排序的成本,降低CPU的消耗。
 缺点:索引列也是要占用空间的。
索引大大提高了查询效率,同时却也降低更新表的速度,如对表进行INSERT、
	UPDATE、DELETE时,效率降低。

在这里插入图片描述

索引结构

  MySQL的索引是在存储引擎层实现的,不同的存储引擎有不同的结构,主要包
  含以下几种:
  B+Tree索引	最常见的索引类型,大部分引擎都支持B+树索引
  Hash索引		底层数据结构是用哈希表实现的,,只有精确匹配索引列的
  			查询才有效,			不支持范围查询
  R+tree(空间索引)空间索引是MyISAM引擎的一个特殊索引类型,主要用于
  			地理空间数				据类型,通常使用较少
  Full-text(全文索引)是一种通过建立倒排索引,快速匹配文档的方式,类
  			似于Lucene,				Solr,ES
二叉树
顺序插入时,会形成一个链表,查询性能大大降低。大数据量情况下,层级较
	深,检索速度慢。
红黑树
大数据量情况下,层级较深,检索速度慢

在这里插入图片描述

B-Tree(多路平衡查找树)
以一颗最大度数(max-degree)为5(5阶)的b-tree为:每个结点最多存储4个
	key,	5个指针
B+Tree
以一颗最大度数(max-degree)为4(4阶)的b+tree

在这里插入图片描述

B+Tree与B-Tree区别:
1.所有的数据都会出现在叶子节点
2.叶子节点形成一个单向链表
MySQL索引数据结构对经典的B+Tree进行了优化。在原B+Tree的基础上,增加一
个指向相邻叶子结点的链表指针,就形成了带有顺序指针的B+Tree,提高区间访
问的性能。
Hash
哈希索引就是采用一定的hash算法,将键值换算成心得hash值,映射到对应的槽
 位上,然后存储在hash表中。
如果两个(或多个)键值,映射到一个相同的槽位上,它们就产生了hash冲突
(也称为hash碰撞),可以通过 链表来解决
Hash索引特点
Hash索引只能用于对等比较(= ),不支持范围查询(between,>,<,...)
无法利用索引完成排序操作
查询效率高,通常只需要一次检索就可以了,效率通常要高于B+Tree索引
存储引擎支持
在MySQL中,支持hash索引的是Memory引擎,而InnoDB中具有自适应hash的功
能,hash索引是存储引擎根据B+Tree索引在指定条件下自动构建的。

在这里插入图片描述

为什么InnoDB存储引擎选择使用B+Tree索引结构?
1.相对于二叉树,层级更少,搜索效率高;
2.对于B+Tree,无论是叶子节点还是非叶子节点,都会保存数据,这样导致一页
中存储	的键值减少,指针跟着减少,要同样保存大量数据,只能增加树的高
度,导致性能降低;
3.相对于Hash索引,B+Tree支持范围匹配及排序操作;

在这里插入图片描述

索引分类
主键索引 针对于主键创建的索引		默认自动创建,只能有一个	PRIMARY
唯一索引 避免同一个表中某数据列中的值重复	  可以有多个		UNIQUE
常规索引 快速定位特定数据		可以有多个
全文索引 全文索引查找的是文本中的关键字,而不是比较索引中的值		
	可以有多个		FULLTEXT
在InnoDB存储引擎中,根据索引的存储形式,又可以分为以下两种:
聚集索引  将数据存储与索引放到了一块,索引结构的叶子节点保存了行数据
          必须有,而且只有一个
二级索引  将数据与索引分开存储,索引结构的叶子结点关联的是对应的主键
		  可以存在多个
聚集索引选取规则
如果存在主键,主键索引就是聚集索引。
如果不存在主键,将使用第一个唯一(UNIQUE)索引作为聚集索引。
如果表没有主键,或没有合适的唯一索引,则InnoDB会自动生成一个rowid作
		为隐藏	的聚集索引。

在这里插入图片描述

索引语法

创建索引
CREATE [UNIQUE|FULLLTEXT] INDEX index_name ON table_name(index_col_name,...);
查看索引
SHOW INDEX FROM table_name;
删除索引
DROP INDEX index_name ON table_name;

SQL性能分析

SQL执行频率

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

慢查询日志

慢查询日志记录了所有执行时间超过指定参数(long_query_time,单位:秒,
默认10	秒)的所有SQL语句的日志。MySQl的慢查询日志默认没有开启,需要
在MySQL的配置	文件(/etc/my.cnf)中配置如下信息

开启MySQL慢日志查询开关
slow_query_log=1
设置,澳门日志的时间为2秒,SQL语句执行时间超过2秒,就会视为慢查询,记
	录慢查询日志
long_query_time=2

在这里插入图片描述

profile详情

Show profiles能够在SQL优化时帮助我们了解时间都耗费到哪里去了。通过
		have_profiling参数,能够看到当前MySQL是否支持profile操作;
SELECT @@have_profiling;
默认profiling是关闭的,可以通过set语句在session/global级别开启
	profiling:
SET profiling=1;
执行一系列的业务SQL的操作,然后通过如下指令查看指令的执行耗时;

看每一条SQL的耗时基本情况
show profiles;
查看指令
show profile for query query_id;
查看指定query_id的SQL语句CPU的使用情况
show profile cpu for query query_id;

explain执行计划

EXPLAIN或者DESC命令获取MySQL如何执行SELECT语句信息,包括在SELECT语句
执行过程中表如何连接和连接的顺序。

在这里插入图片描述

语法

查找在select语句之前加上关键字explain/desc
EXPLAIN SELECT 字段列表 FROM 表名 WHERE 条件;
 EXPLAIN执行计划各字段含义:
id 		select查询的序列号,标识查询中执行select子句或者是操作表的顺
	序,执行顺序从上到下;(id不同,值越大,越先执行)
select_type		表示SELECT的类型,常见的取值有SIMPLE(简单表,即不使
用表连接或者子查询)、PRIMARY(主查询,即外层的查询)、UNION(UNION中的
第二个或者后面的查询语句)、SUBQUERY(SELECT\WHERE之后包含了子查询)等
type	表示连接类型,性能由好到差类型为NULL, system, const, 
eq_ref, ref, range, index, all
Possible_key	显示可能应用在这张表上的索引,一个或多个.

EXPLAIN执行计划各字段含义:

Key		实际使用的索引,如果为NULL,则没有使用索引。
Key_len	表示索引中使用的字节数,该值为索引字段最大可能长度,并非实际使用长度,			在不损失精确性的前提下,长度越短越好。
rows	MySQL认为必须要执行查询的行数,在innodb引擎的表中,是一个估计值,			可能并不总是准确的。
Filtered	表示返回结果的行数占需读取行数的百分比,filtered的值越大越好。

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

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

相关文章

详解JS的四种异步解决方案!

目录 同步&异步的概念 js中异步的应用场景 实现异步的四种方法 1、 回调函数 2、Promise 3、Generator 4、 async/await 「异步编程」是前端工程师日常开发中经常会用到的技术&#xff0c;也是校招面试过程中常考的一个知识点。 通过掌握「异步编程」的四种方式&…

redis 和mongodb基础操作练习

目录 redis作业 string、list、hash 数据类型 举例说明list和hash的应用场景&#xff0c;每个至少一个场景 mongodb作业 1. 创建一个数据库 名字grade 2. 数据库中创建一个集合名字 class 3. 集合中插入若干数据 文档格式如下 4. 查找 5. 增加、更新、删除、统计 re…

【电路原理学习笔记】第3章:欧姆定律:3.1 电压、电流与电阻的关系

第3章&#xff1a;欧姆定律 3.1 电压、电流与电阻的关系 欧姆定律指出&#xff1a;电流与电压成正比&#xff0c;与电阻成反比。即 I V R I\frac{V}{R} IRV​ 3.1.1 电压与电流之间的线性关系 数学上&#xff0c;线性指的是变量之间的关系在图形上是一条直线。线性方程所对…

数据结构与算法——希尔排序(引例、希尔增量序列、原始希尔排序、代码、时间复杂度、Hibbard增量序列、Sedgewick增量序列)

目录 引例 希尔增量序列 原始希尔排序 代码&#xff08;C语言&#xff09; 时间复杂度 更多增量序列 Hibbard增量序列 Sedgewick增量序列 希尔排序&#xff08;by Donald Shell&#xff09; 引例 给以下序列进行排序&#xff1a; 先以5的间隔进行插入排序&#xff1a…

自学数据结构和算法(5)

二叉树的遍历 分为先序、中序、和后序遍历。 这三种遍历都可以由递归序来得到&#xff1a; &#xff08;1&#xff09;先序遍历&#xff08;也是二叉树的深度优先遍历&#xff09;是第一次到某个结点才打印&#xff1b; &#xff08;2&#xff09;中序遍历是第二次到某个结…

【ACM】—蓝桥杯大一暑期集训Day3

&#x1f680;欢迎来到本文&#x1f680; &#x1f349;个人简介&#xff1a;陈童学哦&#xff0c;目前正在学习C/C、Java、算法等方向&#xff0c;一个正在慢慢前行的普通人。 &#x1f3c0;系列专栏&#xff1a;陈童学的日记 &#x1f4a1;其他专栏&#xff1a;CSTL&#xff…

PCL 获取点集中距离最近的两个点(二维)

文章目录 一、简介二、实现代码三、实现效果参考资料一、简介 给定一个平面上n个点的点集,问题是找出点集中最近的点对。这个问题经常出现在许多应用程序中,例如,在空中交通管制中,监视靠得太近的飞机,因为这可能发生碰撞。这里实现一种方式来获取这两个点,具体计算过程如…

换零钱II:零钱面值动态变化,class方法自动兑换最少零钱(贪心算法)

银行现存零钱面值种类动态变化但数量无限&#xff0c;类方法change()完成指定金额的最少零钱个数兑换。 (本笔记适合学透python基本数据结构&#xff0c;熟悉class的基构造&#xff0c;对类内全局变量有一定认的 coder 翻阅) 【学习的细节是欢悦的历程】 Python 官网&#xff1…

C++并发编程(4):共享数据的问题、使用互斥量保护共享数据、死锁

在线程间共享数据 参考博客 线程间共享数据——使用互斥量保护共享数据 [c11]多线程编程(四)——死锁(Dead Lock) c多线程之死锁 C 死锁及解决办法 共享数据的问题 设想你有一段时间和朋友合租公寓&#xff0c;公寓只有一个厨房和一个浴室。除非你们的感情格外深厚&#xff0…

KBQA项目-基于豆瓣电影TOP250数据的知识图谱对话机器人

从今天开始&#xff0c;我们要一起来学习一个新的课程&#xff0c;叫做《基于豆瓣电影TOP250数据的知识图谱对话机器人》&#xff0c;同时&#xff0c;这个课程也是「知识图谱」系列的第一个项目。 项目演示 课程内容 1、爬取数据&#xff1a;使用reqests库&#xff0c;结合b…

贝莱德CEO再谈比特币ETF:客户需求让我们进军加密市场

来源&#xff1a;CNBC 编译&#xff1a;WEEX Exchang 「进军加密货币领域符合这家资产管理巨头更广泛的使命&#xff0c;即为投资者创造易用且低成本的产品。」贝莱德 CEO Larry Fink 周五&#xff08;7 月 14 日&#xff09;在 CNBC 「街谈巷议」&#xff08;Squawk on the St…

Java 设计模式——装饰者模式

目录 1.概述2.结构3.案例实现3.1.抽象组件3.2.具体组件3.3.抽象装饰3.4.具体装饰3.5.测试 4.优缺点5.使用场景6.JDK 源码解析——BufferedWriter7.装饰者模式和静态代理的比较 1.概述 &#xff08;1&#xff09;我们先来看一个快餐店的例子&#xff1a;快餐店有炒面、炒饭这些…

PCB板框评估及叠层设计

PCB板框评估及叠层设计 板框评估叠层设计 板框评估 首先选中所有器件&#xff0c;点击下图指令 在PCB中画一个矩形框&#xff0c;所有器件将会排列在这个框中 快捷键 E O S 重新定义原点 选择机械1层&#xff0c;快捷键P L 画出大致的板框&#xff0c;板框画好之后&#x…

全网最详细4W字Flink入门笔记(下)

本文已收录至Github&#xff0c;推荐阅读 &#x1f449; Java随想录 文章目录 Flink State状态CheckPoint & SavePointCheckPoint原理SavePoint原理 StateBackend状态后端MemoryStateBackendFsStateBackendRocksDBStateBackend集群级配置StateBackend Window滚动窗口&#…

从小白到大神之路之学习运维第61天--------Ansible自动化运维工具(playbook配置文件深入了解)

第三阶段基础 时 间&#xff1a;2023年7月14日 参加人&#xff1a;全班人员 内 容&#xff1a; playbook配置文件 目录 playbook配置文件 一、playbook配置文件概念 修改hosts文件 建立playbook配置文件 yml脚本写法注释&#xff1a; 二、Playbook的核心元素 三、…

【动手学深度学习】--06.暂退法Dropout

文章目录 暂退法(Dropout)1.原理1.1动机1.2无偏差的加入噪音1.3使用丢弃法1.4推理中的丢弃法 2.从零实现Dropout2.1定义模型参数2.2定义模型2.3训练和测试 3.简洁实现 暂退法(Dropout) 学习视频&#xff1a;丢弃法【动手学深度学习v2】 官方笔记&#xff1a;暂退法&#xff0…

vue+canvas图片裁切

vuecanvas图片裁切 头像的裁切、图片的一些处理…… vue&#xff1a;路由router、vuex状态管理 组件效果 组件代码&#xff1a; 实现思路 盒子即一张画布&#xff0c;把选择的图片放到画布中进行裁切&#xff0c;按照canvas的一些语法裁切一部分内容。 有一个固定大小的画布&am…

字节有点飘了,现在阿里员工跳槽字节不受待见

上一篇&#xff1a;对不起&#xff0c;实在扛不住了。。。 字节现在厉害了&#xff0c;不愧为宇宙第一大厂。 阿里员工现在跳槽字节被鄙视&#xff0c;阿里经历竟然是减分项。 据某互联网大厂HR发文透漏&#xff1a;现在阿里跳字节真的不受待见&#xff0c;背景是负加成。 他举…

JVM内存结构——前言

前提 1. 认识JVM&#xff0c;什么是JVM 简单来说&#xff0c;就是java程序的运行环境&#xff08;java二进制字节码的运行环境&#xff09; 1.1 JVM &#xff08;java虚拟机&#xff09;的好处 &#xff1a; 一次编写&#xff0c;到处运行的机制 &#xff08;因为java语言是跨…

【SQL应知应会】表分区(三)• MySQL版

欢迎来到爱书不爱输的程序猿的博客, 本博客致力于知识分享&#xff0c;与更多的人进行学习交流 本文收录于SQL应知应会专栏,本专栏主要用于记录对于数据库的一些学习&#xff0c;有基础也有进阶&#xff0c;有MySQL也有Oracle 分区表 • MySQL版 前言一、分区表1.非分区表2.分区…