【MySQL】非聚簇索引和聚簇索引,索引的创建、查询、删除

目录

存储引擎是MyISAM

非聚簇索引

主键索引:

 普通(辅助)索引:

存储引擎是InnoDB

聚簇索引

主键索引:

普通(辅助)索引:

回表查询

创建索引

创建主键索引

主键索引的特点:

创建唯一索引

唯一索引的特点:

创建普通索引

查询索引

删除索引

删除主键索引

删除其他索引(普通索引、唯一键索引)


存储引擎是MyISAM

非聚簇索引

MyISAM存储引擎采用B+树作为索引结构,B+树的叶子节点中存储的是主键值或普通键值对应的用户数据的地址。

可以同通过以MyISAM为存储引擎的表的文件构成来验证非聚簇索引的索引数据和用户数据是分开的:

在数据库test1_db中创建一个table:mtest

然后查看test1_db中的mtest表文件:

mtest.MYD就是表mtest的数据,mtest.MYI就是表mtest的索引数据,可以看到这两个文件是分开的。

这种用户的数据与索引数据分开的索引就是非聚簇索引。

主键索引

 普通(辅助)索引

采用MyISAM存储引擎表的普通索引和主键索引没有太大的区别,只不过就是普通索引的索引值可以重复,主键索引值则不能重复。

存储引擎是InnoDB

聚簇索引

InnoDB存储引擎采用B+树作为索引结构,B+树的叶子节点中存储的是主键值和对应的用户数据。

同样在数据库test1_db中创建一个table:itest

查看test1_db中的itest表文件:

itest.ibd是itest表的数据和索引数据。

这种用户数据和索引数据在一起的索引就是聚簇索引。

主键索引


普通(辅助)索引

回表查询

采用InnoDB存储引擎的表的非主键索引即普通索引的索引结构如上图,可以看到,叶子节点存储的是索引数据对应得主键值,而不是用户数据。使用普通索引查询数据时,要进行两次索引查找,第一次是先通过普通索引找到要查询数据记录得主键值,然后再依据主键值通过主键索引进行查找用户数据,这种查询方式就是回表查询

为什么InnoDB的普通索引结构的叶子节点中存储的不是用户数据而是主键值?

因为主键索引结构的叶子节点已经存储了用户数据,建立索引结构也是需要空间的,如果普通索引的叶子节点也存储了用户数据那么就重复存储了,造成不必要的空间浪费。因此这种做法是为了节省空间。

创建索引

创建主键索引

1.创建表时直接在字段名后加primary key

create table test1(id int primary key,name varchar(10))

2.创建表时在表的最后指定某字段

create table test1(id int,name varchar(10),primary key(id));

3. 表创建后添加

alter table test1 add primary key(id);
主键索引的特点:

1.一个表中只能有一个主键索引,可以使用复合主键

2.查找效率高

3.主键列的值不能为null,且不能重复

4.主键索引的列基本是int

创建唯一索引

常见唯一索引和创建主键索引写法一样,将primary key换成unique即可。

唯一索引的特点:

1.一个表中可以有多个唯一索引

2.查询效率高

3.唯一索引列不能有重复值。

创建普通索引

1.

mysql> create table test4(
    -> id int,
    -> email varchar(30),
    -> index(email)
    -> );

2.

alter table test4 add index(email);

3.创建一个索引名为idx_name的索引

create index idx_name on test4(email);

查询索引

show keys from 表名 \G;

我们创建一个含有主键索引、唯一键索引、普通索引的表:

mysql> create table test_db(
    -> id int unsigned primary key,
    -> tel_number char(11) unique,
    -> name varchar(10) not null,
    -> index(name)
    -> );

查看表test_db的结构:

PRI:主键约束。UNI:唯一键约束。MUL:值可以重复。

查看表test_db的索引:

 

删除索引

删除主键索引

alter table 表名 drop primary key;

删除其他索引(普通索引、唯一键索引)

1.

alter table 表名 drop index 索引名;

这里的索引名就是show keys from 表明中的Key_name。

 2.

drop index 字段名 on 表名;

 创建索引的原则

1.更新频繁的字段不适合创建索引。

2.不会在where子句后出现的字段不适合创建索引。

3.唯一性太差的字段不适合创建索引,即使频繁作为查询条件。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

list的常用操作

list的介绍 list是序列容器,它允许在常数范围O(1)进行插入和删除在这段序列的任意位置,并且可以双向遍历 它是弥补vector容器的缺点,与vector有互补的韵味, 这里我们可以将其进行与vector进行对比 vect…

C# opencvsharp 流程化-脚本化-(2)ROI

ROI ROI也是经常需要使用的方法。特别是在图像编辑中。ROI又称感兴趣的区域,但是图像是矩阵是矩形的,感兴趣的是乱八七糟的,所以还有一个Mask需要了解一下的。 public class RoiStep : IImageProcessingStep{public ImageProcessingStepType…

极狐GitLab 正式发布安全补丁版本 17.6.2、17.5.4、 17.4.6

本分分享极狐GitLab 补丁版本 17.6.2, 17.5.4, 17.4.6 的详细内容。这几个版本包含重要的缺陷和安全修复代码,我们强烈建议所有私有化部署用户应该立即升级到上述的某一个版本。对于极狐GitLab SaaS,技术团队已经进行了升级,无需用户采取任何…

在window环境下安装openssl生成钥私、证书和签名,nodejs利用express实现ssl的https访问和测试

在生成我们自己的 SSL 证书之前,让我们创建一个简单的 Express应用程序。 要创建一个新的 Express 项目,让我们创建一个名为node-ssl -server 的目录,用终端cmd中进入node-ssl-server目录。 cd node-ssl-server 然后初始化一个新的 npm 项目…

CTFHub ssrf

第一关(内网访问) 尝试访问位于127.0.0.1的flag.php吧 第二关(伪协议读取文件) 尝试去读取一下Web目录下的flag.php吧 1.首先尝试http://127.0.0.1/flag.php 2.查看页面源代码 3.根据提示输入file:///var/www/html/flag.php 4.查看页面源代码 第三关&…

vue3+vite一个IP对站点名称的前端curd更新-会议系统优化

vue3-tailwind-todo https://github.com/kgrg/vue3-tailwind-todo 基于这个项目,把ip到sta的映射做了前端管理. 核心代码是存储和获得的接口,需要flask提供. def redis2ipdic():global ipdicipdic.clear()tmdiccl.hgetall(IPDIC_KEY)for k in tmdic.keys():ipdic[k.decode() …

idea无法识别文件,如何把floder文件恢复成model

前景: 昨天,我在之前的A1214模块包下新增了一个demo类,然后又新建了一个A1216模块,写了算法题,后面打算用git提交,发现之前的A1214模块下的demo类和新建的模块源文件都已经被追踪了,都是绿色的&…

如何调大unity软件的字体

一、解决的问题: unity软件的字体太小,怎么调大点?二、解决方法: 1.操作步骤: 打开Unity编辑器> Edit>preferences> UI Scaling>Use custom scaling value(取消勾选“使用默认桌面设置”&…

冯诺依曼架构与哈佛架构的对比与应用

冯诺依曼架构(Von Neumann Architecture),也称为 冯诺依曼模型,是由著名数学家和计算机科学家约翰冯诺依曼(John von Neumann)在1945年提出的。冯诺依曼架构为现代计算机奠定了基础,几乎所有现代…

实操给桌面机器人加上超拟人音色

前面我们讲了怎么用CSK6大模型开发板做一个桌面机器人充当AI语音助理,近期上线超拟人方案,不仅大模型语音最快可以1秒内回复,还可以让我们的桌面机器人使用超拟人音色、具备声纹识别等能力,本文以csk6大模型开发板为例实操怎么把超…

Fiddle突然抓不到虚拟机的地址

Fiddle不抓虚拟机的地址了 查看是否更换了ip地址,我是因为换了网络 更换正确的ip地址

Flutter组件————AppBar

AppBar 是 Flutter 中用于创建应用程序顶部栏的组件,它遵循 Material Design 规范。 参数: 参数名称类型描述titleWidget设置 AppBar 中的标题文本或自定义标题小部件。automaticallyImplyLeadingbool决定是否自动添加返回按钮(如果页面不是…

【Java基础面试题025】什么是Java的Integer缓存池?

回答重点 Java的Integer缓存池(Integer Cache)是为了提升性能和节省内存。根据实践发现大部分的数据操作都集中在值比较小的范围,因此缓存这些对象可以减少内存分配和垃圾回收的负担,提升性能 在 -128到127范围内的Integer对象会…

【JavaEE初阶】线程 和 thread

本节⽬标 认识多线程 掌握多线程程序的编写 掌握多线程的状态 一. 认识线程(Thread) 1概念 1) 线程是什么 ⼀个线程就是⼀个 "执⾏流". 每个线程之间都可以按照顺序执⾏⾃⼰的代码. 多个线程之间 "同时" 执⾏着多份代码. 还…

js 面试题

目录 Promise调用 Set 递归 有一个楼梯,每次可以走1个台阶或2个台阶,总共有几种走法 计算1~100之和 数组 求数组中最大值 迭代(遍历)数组 扁平化数组 使用flat toString() 手写递归 使用while 数组倒序 对象 对象属性遍历 扁平化对象 Promise调用 …

在租用服务器上配置环境

使用的是并行计算云,现在有活动,可以用到明年3月多。50元入会,有500元的卷。 注册完会员后,按照图里说的领卷即可,卷会发送到邮箱里,按照要求兑换就好。下面是具体使用流程。 可以在不开机的情况下&#…

run postinstall error, please remove node_modules before retry!

下载 node_modules 报错:run postinstall error, please remove node_modules before retry! 原因:node 版本出现错误,我的项目之前是在 12 下运行的。解决方法: 先卸载node_modules清除缓存将node版本切换到12重新下载即可

基于蓝牙通信的手机遥控智能灯(论文+源码)

1.系统设计 灯具作为人们日常生活的照明工具为人们生活提供光亮,本次基于蓝牙通信的手机遥控智能灯设计功能如下: (1)用户可以通过蓝牙通信模块的作用下,在手机端遥控切换智能灯不同的工作模式; &#x…

IDEA搭建SpringBoot,MyBatis,Mysql工程项目

目录 一、前言 二、项目结构 三、初始化项目 四、SpringBoot项目集成Mybatis编写接口 五、代码仓库 一、前言 构建一个基于Spring Boot框架的现代化Web应用程序,以满足[公司/组织名称]对于[业务需求描述]的需求。通过利用Spring Boot简化企业级应用开发的优势&…

[HNCTF 2022 Week1]你想学密码吗?

下载附件用记事本打开 把这些代码放在pytho中 # encode utf-8 # python3 # pycryptodemo 3.12.0import Crypto.PublicKey as pk from hashlib import md5 from functools import reducea sum([len(str(i)) for i in pk.__dict__]) funcs list(pk.__dict__.keys()) b reduc…