【SQL应知应会】索引(三)• MySQL版:聚簇索引与非聚簇索引;查看索引与删除索引;索引方法

请添加图片描述

欢迎来到爱书不爱输的程序猿的博客, 本博客致力于知识分享,与更多的人进行学习交流

本文收录于SQL应知应会专栏,本专栏主要用于记录对于数据库的一些学习,有基础也有进阶,有MySQL也有Oracle

请添加图片描述

索引 • MySQL版

  • 前言
  • 一、索引
  • 1.简介
  • 2.索引类型之逻辑分类
  • 3.索引类型之物理分类
    • 3.1 聚簇索引 (clustered index)
    • 3.2 非聚簇索引
    • 3.3 索引方法
      • 3.3.1 B-TREE
      • 3.3.2 B+TREE
      • 3.3.3 HASH
  • 4.查看索引(SHOW INDEX)
    • 4.1 查看索引的语法格式
    • 4.2 示范
  • 5. 删除索引
    • 5.1 删除索引的语法格式
    • 5.2 示范

前言

✅今天继续SQL的索引的第 3 篇文章,主要讲到了聚簇索引与非聚簇索引、查看索引与删除索引、索引方法,大家拭目以待吧!
✴️文章中提供了代码和很具体的截图,代码是为了减轻大家学习的难度,同时用截图可以更形象的让大家去理解知识点想要表达的意思,希望大家跟着一起学起来
💖希望文章的内容对大家有所帮助,如果有什么不足的地方,大家可以在评论区或者私信我,感谢大家的支持
💻那么,快拿出你的电脑,跟着文章一起学习起来吧

一、索引

1.简介

  • 索引(一)中描述了索引的优点与缺点,可以帮助我们更好的理解为什么使用索引以及学习索引应该思考哪些问题。

2.索引类型之逻辑分类

  • 索引(一)中主要讲了索引按逻辑分类后,普通索引和复合索引的创建与应用,其中复合索引的创建是重中之重,重点讲述了六大应用,对于“最左前缀”进行了三种情况的详细分析;
  • 索引(二)重点补充了逻辑分类中的唯一索引、主键索引以及全文索引,并针对唯一索引与复合索引、主键索引与复合索引进行了对比分析,加强对各类索引的理解和应用。

3.索引类型之物理分类

  • 分为聚簇索引(主键索引和唯一索引)和非聚簇索引(有时也称辅助索引或二级索引)
  • 聚簇是为了提高某个属性(或属性组)的查询速度,把这个或这些属性(称为聚簇码)上具有相同值的元组集中存放在连续的物理块。

3.1 聚簇索引 (clustered index)

  • 不是单独的一种索引类型,而是一种数据存储方式。
  • 这种存储方式是依靠B+树来实现的,根据表的主键构造一棵B+树且B+树叶子节点存放的都是表的行记录数据时,方可称该主键索引为聚簇索引。
  • 聚簇索引也可理解为将数据存储与索引放到了一块,找到索引也就找到了数据。

3.2 非聚簇索引

  • 数据和索引是分开的,B+树叶子节点存放的不是数据表的行记录。
  • 虽然InnoDB(支持事务)和MyISAM存储引擎(不支持事务)都默认使用B+树结构存储索引,但是只有InnoDB的主键索引才是聚簇索引,InnoDB中的辅助索引以及MyISAM使用的都是非聚簇索引。
  • 每张表最多只能拥有一个聚簇索引(一个表只能有一个主键)

3.3 索引方法

3.3.1 B-TREE

  • B-树就是B树,多路搜索树,树高一层意味着多一次的磁盘I/O,下图是3阶B树

在这里插入图片描述

  • 特征:
    • 关键字集合分布在整颗树中;
    • 任何一个关键字出现且只出现在一个结点中;
    • 搜索有可能在非叶子结点结束;
    • 其搜索性能等价于在关键字全集内做一次二分查找;
    • 自动层次控制

3.3.2 B+TREE

  • B+树是B-树的变体,也是一种多路搜索树,见图:

在这里插入图片描述

  • 特征:
    • 所有关键字都出现在叶子结点的链表中(稠密索引),且链表中的关键字恰好是有序的;
    • 不可能在非叶子结点命中;
    • 非叶子结点相当于是叶子结点的索引(稀疏索引),叶子结点相当于是存储(关键字)数据的数据层;
    • 每一个叶子节点都包含指向下一个叶子节点的指针,从而方便叶子节点的范围遍历
    • 更适合文件索引系统

3.3.3 HASH

  • 哈希索引就是采用一定的哈希算法,把键值换算成新的哈希值,检索时不需要类似B+树那样从根节点到叶子节点逐级查找,只需一次哈希算法即可立刻定位到相应的位置,速度非常快。

  • Hash索引仅仅能满足=,IN<=>查询,不能使用范围查询,也不支持任何范围查询,例如WHERE price > 100

  • 由于Hash索引比较的是进行Hash运算之后的Hash值,所以它只能用于等值的过滤不能用于基于范围的过滤,因为经过相应的Hash算法处理之后的Hash值的大小关系,并不能保证和Hash运算前完全一样。
    在这里插入图片描述

4.查看索引(SHOW INDEX)

4.1 查看索引的语法格式

SHOW INDEX FROM <表名> [ FROM <数据库名>]
  • <表名>:指定需要查看索引的数据表名
  • <数据库名>:指定需要查看索引的数据表所在的数据库

4.2 示范

  • emp表的索引情况
    在这里插入图片描述
  • 使用SQL查看
show index from emp;

在这里插入图片描述

  • table : 表名
  • Non_unique : 表示该索引是否是唯一索引
    • 若不是唯一索引,则该列的值为 1;
    • 若是唯一索引,则该列的值为 0
  • Key_name : 索引的名称
  • Seq_in_index : 表示该列在索引中的位置
    • 如果索引是单列的,则该列的值为 1;
    • 如果索引是组合索引,则该列的值为每列在索引定义中的顺序
  • Column_name : 定义索引的列字段
  • Collation :表示列以何种顺序存储在索引中
    • 在 MySQL 中,升序显示值“A”(升序),若显示为 NULL,则表示无分类
  • Cardinality : 索引中唯一值数目的估计值
    • 基数根据被存储为整数的统计数据计数,所以即使对于小型表,该值也没有必要是精确的。基数越大,当进行联合时, MySQL 使用该索引的机会就越大
  • Sub_part : 表示列中被编入索引的字符的数量
    • 若列只是部分被编入索引,则该列的值为被编入索引的字符的数目;
    • 若整列被编入索引,则该列的值为 NULL
  • Packed : 指示关键字如何被压缩。若没有被压缩,值为 NULL
  • Null : 显示索引列中是否包含 NULL
  • Index_type : 显示索引使用的类型和方法( BTREE、 FULLTEXT、 HASH、 RTREE)
  • Comment : 显示注释

5. 删除索引

5.1 删除索引的语法格式

  • 使用 DROP INDEX 语句
DROP INDEX <索引名> ON <表名><索引名>:要删除的索引名
<表名>:指定该索引所在的表名
  • 使用 ALTER TABLE 语句
ALTER TABLE <> + [1/2/3]1DROP PRIMARY KEY:表示删除表中的主键索引
句2DROP INDEX index_name:表示删除名称为 index_name 的索引
句3DROP FOREIGN KEY fk_symbol:表示删除外键

如果删除的列是索引的组成部分,那么在删除该列时,也会将该列从索引中删除;如果组成索引的所有列都被删除,那么整个索引将被删除

5.2 示范

drop index index_empno on emp; # 索引名称为index_empno
# 前面4.2中的示范里,索引的名称是2,使用这条SQL语句删除时,会报错,正常情况下,索引名称都不会这样取得,所以无需纠结这种情况alter table emp drop index index_empno;

😘感谢大家耐心的看完这篇文章,这篇文章是MySQL索引的第3篇文章
✅如果大家觉着内容还算可以,那么就关注一下爱书不爱输的程序猿
🏡也可以加入我的社区一起学习呀
🎁各种专栏,精彩不断

  • SQL应知应会专栏,对于数据库的一些学习,有基础也有进阶,有MySQL也有Oracle
  • UML应知应会专栏,对于UML的一些讲解,应有尽有
  • … … 还有java的专栏算法与数据结构的专栏等其他专栏,快去我的主页关注我吧

请添加图片描述

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

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

相关文章

【李沐】3.2线性回归从0开始实现

%matplotlib inline import random import torch from d2l import torch as d2l1、生成数据集&#xff1a; 看最后的效果&#xff0c;用正态分布弄了一些噪音 上面这个具体实现可以看书&#xff0c;又想了想还是上代码把&#xff1a; 按照上面生成噪声&#xff0c;其中最后那…

利用大模型反馈故障的解决方案

背景 观测云有两个错误巡检脚本&#xff0c;RUM 错误巡检和 APM 错误巡检&#xff0c;代码均开源。 错误巡检的主要目的是发现新出现的错误消息(error stack)&#xff0c;原有的巡检在上报了相应的事件报告后&#xff0c;只是定位了问题&#xff0c;并没有给出合适的解决方案。…

C++(3)C++对C的扩展Extension

类型增强 1、类型更加严格 不初始化&#xff0c;无法通过编译&#xff1b;C不初始化&#xff0c;则随机赋值 #include <iostream> #include <stdlib.h>int main() {const int a 100; //真正的const,无法修改 // int *p &a; 报错const int *p…

Pandas基础知识

文章目录 Pandas的数据结构Series --- 由数据和索引组成&#xff08;索引&#xff08;index&#xff09;在左&#xff0c;数据&#xff08;values&#xff09;在右&#xff09;DataFrame --- 索引包括行索引和列索引&#xff0c;每列数据可以是不同的类型 Pandas的索引操作 ---…

SpringMVC拦截器学习笔记

SpringMVC拦截器 拦截器知识 拦截器(Interceptor)用于对URL请求进行前置/后置过滤 Interceptor与Filter用途相似但实现方式不同 Interceptor底层就是基于Spring AOP面向切面编程实现 拦截器开发流程 Maven添加依赖包servlet-api <dependency><groupId>javax.se…

C++学习之九

1)普通类的成员函数模板 class A { public:template<typename T> //类的成员函数模板,//成员函数模板和函数模板长得样子一样&#xff01;void func(T tmp); };template<typename T> void A::func(T tmp) {cout << tmp << endl; }int main() {A a;a.…

nginx代理webSocket链接,webSocket频繁断开重连

一、场景 1、使用nginx代理webSocket链接&#xff0c;消息发送和接收都是正常的&#xff0c;但webSocket链接会频繁断开重连 2、如果不使用nginx代理则一切正常 3、程序没有做webSocket心跳处理 如下图 二、nginx代理配置 upstream cloud_ass {#ip_hash;server 192.168.1.…

2023年国赛数学建模思路 - 案例:随机森林

文章目录 1 什么是随机森林&#xff1f;2 随机深林构造流程3 随机森林的优缺点3.1 优点3.2 缺点 4 随机深林算法实现 建模资料 ## 0 赛题思路 &#xff08;赛题出来以后第一时间在CSDN分享&#xff09; https://blog.csdn.net/dc_sinor?typeblog 1 什么是随机森林&#xff…

leetcode做题笔记95. 不同的二叉搜索树 II

给你一个整数 n &#xff0c;请你生成并返回所有由 n 个节点组成且节点值从 1 到 n 互不相同的不同 二叉搜索树 。可以按 任意顺序 返回答案。 思路一&#xff1a;递归 struct TreeNode ** partition(int start, int end, int* returnSize){*returnSize 0;int size 32;stru…

从2023年世界机器人大会发现机器人新趋势

机器人零部件为何成2023年世界机器人大会关注热门&#xff1f; 在原先&#xff0c;机器人的三大核心零部件是控制系统中的控制器、驱动系统中的伺服电机和机械系统中的精密减速器。如今&#xff0c;机器人的主体框架结构已经落实&#xff0c;更多机器人已经开始深入到各类场景中…

c++ std::sort的简单用法

直接看代码即可&#xff0c;对于lambda部分的解释&#xff1a;a,b基本算作两个抽象的比较对象&#xff0c;每次会比较这两个&#xff0c;返回true:表示a应该排在b前面(a<b)&#xff0c;返回false:表示b应该排在a前面(a>b)&#xff0c;具体可查看cpprefernece #include &…

Prompt本质解密及Evaluation实战(一)

一、基于evaluation的prompt使用解析 基于大模型的应用评估与传统应用程序的评估不太一样&#xff0c;特别是基于GPT系列或者生成式语言模型&#xff0c;因为模型生成的内容与传统意义上所说的内容或者标签不太一样。 以下是借用了ChatGPT官方的evaluation指南提出的对结果的具…

kali的一些使用和ms08-067、ms17-010漏洞

VM虚拟机-三种网络连接方式&#xff08;桥接、NAT、仅主机模式&#xff09; 虚拟机网络连接 一、Bridged&#xff08;桥接&#xff09; 二、NAT&#xff08;网络地址转换&#xff09; 三、Host-Only&#xff08;仅主机&#xff09; 在vmware软件中&#xff0c;选项栏的“编…

[计算机入门] 窗口操作

3.3 窗口操作 之前介绍过如何调整窗口大小。接下来介绍如何对窗口进行排布等操作。 当我们想要将某个窗口调整到整个屏幕的左边或者右边(占整个屏幕的一半)&#xff0c;可以在选中并激活窗口后&#xff0c;按Win ←/→ 进行调整。 此时&#xff0c;还可以通过Win↑/↓调整该…

微信小程序教学系列(3)

微信小程序教学系列 第三章&#xff1a;小程序高级开发技巧 1. 小程序API的使用 小程序API简介 小程序API是小程序提供的一系列接口&#xff0c;用于实现各种功能和操作。通过调用小程序API&#xff0c;可以实现页面跳转、数据存储、网络请求等功能。 使用小程序API的步骤…

ATFX汇市:杰克逊霍尔年会降至,鲍威尔或再发鹰派言论

环球汇市行情摘要—— 昨日&#xff0c;美元指数下跌0.11%&#xff0c;收盘在103.33点&#xff0c; 欧元升值0.22%&#xff0c;收盘价1.0898点&#xff1b; 日元贬值0.58%&#xff0c;收盘价146.23点&#xff1b; 英镑升值0.18%&#xff0c;收盘价1.2757点&#xff1b; 瑞…

Flutter GetXController 动态Tabbar 报错问题

场景&#xff1a; 1.Tabbar的内容是接口获取的 2. TabController? tabController;&#xff1b; 在onInit 方法中初始化tabbarController tabController TabController(initialIndex: 0, length: titleDataList.length, vsync: this); 这时候会报一个错误 Controllers l…

docker版jxTMS使用指南:使用jxTMS提供数据

本文讲解了如何jxTMS的数据访问框架&#xff0c;整个系列的文章请查看&#xff1a;docker版jxTMS使用指南&#xff1a;4.4版升级内容 docker版本的使用&#xff0c;请查看&#xff1a;docker版jxTMS使用指南 4.0版jxTMS的说明&#xff0c;请查看&#xff1a;4.0版升级内容 4…

微信小程序教学系列(8)

微信小程序教学系列 第八章&#xff1a;小程序国际化开发 欢迎来到第八章&#xff01;这一次我们要谈论的是小程序国际化开发。你可能会问&#xff0c;什么是国际化&#xff1f;简单来说&#xff0c;国际化就是让小程序能够适应不同的语言和地区&#xff0c;让用户们感受到更…

Python 合并多个 PDF 文件并建立书签目录

今天在用 WPS 的 PDF 工具合并多个文件的时候&#xff0c;非常不给力&#xff0c;居然卡死了好几次&#xff0c;什么毛病&#xff1f;&#xff01; 心里想&#xff0c;就这么点儿功能&#xff0c;居然收了我会员费都实现不了&#xff1f;不是吧…… 只能自己来了&#xff0c;…