【浅学Java】索引的分类、创建、删除以及新特性

news2025/1/17 5:56:50

索引的创建和设计原则

  • 1. 索引的分类
    • 1.1 普通索引
    • 1.2 唯一性索引
    • 1.3 主键索引
    • 1.4 单列索引
    • 1.5 多列(联合,组合)索引
    • 1.6 全文索引
  • 2. 索引的创建
    • 2.1 创建表时创建索引
      • 1. 隐式创建
      • 2. 显式创建
      • 3. 全文检索
    • 2.2 创建表后创建索引
      • 1. alter table 的方式
      • 2. create index 的方式
  • 3. 索引的删除
  • 4. 索引新特性
    • 4.1 支持降序索引
    • 4.2 隐藏索引
      • 1. 创建隐藏索引的方式
      • 2. 修改索引是否隐藏

1. 索引的分类

按照功能逻辑进行分类:普通索引,唯一性索引,主键索引,全文索引

按照物理方式进行分类:聚簇索引,非聚簇索引

按照作用字段个数分类:单列索引,联合索引

1.1 普通索引

在创建索引时,不加任何的限制条件。这类索引可以创建在任何数据类型,其值是否为空和唯一,是由字段本本身的约束条件所决定

1.2 唯一性索引

使用 UNIQUE参数 可以设置唯一性索引,在创建唯一性索引时,限制该索引值必须是唯一的,但允许有空值

1.3 主键索引

主键索引就是一种特殊的唯一性索引,在唯一索引的基础上增加了不为空的约束,也就是 NOT NULL+UNIQUE,一张表里面最多只有一个主键索引。

why?

这是由主键索引的物理实现方式决定的,因为数据在内存中只能按照一种顺序进行存储

1.4 单列索引

作用在一个字段上的索引就是单列索引

1.5 多列(联合,组合)索引

作用在多个字段上的索引,使用时遵循最左前缀原则。

1.6 全文索引

全文索引是目前搜索引擎使用的一种关键技术,适用于大规模数据的检索。使用 FULLTEXT 可以设置全文索引。在整个索引中出现的次数越少的词语,匹配时的相关度就越高。

在当前的大数据时代,关系型数据库对全文索引的需求力不从心。逐渐被其他的搜索引擎代替,所以在MySQL当中,并不会去使用全文索引。

2. 索引的创建

创建索引的方式可以大体上分为两类:

  1. 造表时创建索引
  2. 造表后创建索引

2.1 创建表时创建索引

1. 隐式创建

在使用 create table 创建表时,除了可以定义列的数据类型外,还可以定义主键约束,外键约束或者唯一性约束,这些约束在创建同时,也就创建了一个对应的索引。

比如:

create table dept(
dept_id int primary key auto_increment,
dept_name varchar(20)
);

create table emp(
emp_id int primary key auto_increment,
emp_name varchar(20) unique,
dept_id int,
constraint emp_dept_id_fk foreign key(dept_id) references dept(dept_id)
);

结果:
在这里插入图片描述

2. 显式创建

创建普通索引:

create table book(
book_id int,
book_name varchar(100),
authors varchar(100),
info varchar(100),
comment varchar(100),
year_publication year,
-- 声明索引
index idx_bname(book_name)
);

在这里插入图片描述
创建由约束的索引:

create table book1(
book_id int,
book_name varchar(100),
authors varchar(100),
info varchar(100),
comment varchar(100),
year_publication year,
-- 声明索引
unique index uk_idx_comment(comment),-- 创建唯一性约束
primary key (book_id),-- 创建主键约束
index nul_bid_bname_info(book_id,book_name,info)-- 创建联合索引
);

在这里插入图片描述
注意:联合索引遵循最左前缀原则

3. 全文检索

全文索引和上面的创建方式基本一致:fulltext indec(info),但是全文索引的查询方式比较特殊:

select * from book where match(info) against (‘查询字符串’)

注意:

  1. 使用全文索引前,搞清楚版本支持情况
  2. 全文索引比起 like + % 的方式要快 N 倍,但是存在精度问题
  3. 如果需要全文索引的是大量数据。建议先添加数据,再创建索引

2.2 创建表后创建索引

1. alter table 的方式

create table book2(
book_id int,
book_name varchar(100),
authors varchar(100),
info varchar(100),
comment varchar(100),
year_publication year
);
alter table book2 add index idx_cmt(comment);-- 添加普通索引
alter table book2 add unique uk_idx_bname(book_name);-- 添加唯一性索引
alter table book2 add index mul_bid_bname(book_id,book_name); -- 创建联合索引

在这里插入图片描述

2. create index 的方式

create table book3(
book_id int,
book_name varchar(100),
authors varchar(100),
info varchar(100),
comment varchar(100),
year_publication year
);
create index idx_cmt on book3(comment);-- 添加普通索引
create unique index uk_idx_bname on book3(book_name);-- 添加唯一性索引
create index mul_bid_bname on book3(book_id,book_name);-- 创建联合索引

在这里插入图片描述

3. 索引的删除

当表中要进行大量的增删改的工作时,可以考虑先将索引删除掉,等到这些工作做完之后,在将索引进行恢复。

删除索引的方式和上面2.2创建表以后创建索引的方式是对应的:

  1. alter table book drop index idx_xmt;
  2. drop index idx_cmt on book;

注意:添加AUTO_INCREMENT约束字段的唯一索引不能被删除

4. 索引新特性

4.1 支持降序索引

创建联合索引:

create table ts1(
a int,
b int,
index idx_a_b(a ASC,b DESC)
);

插入数据:

DELIMITER //
create procedure ts_insert()
begin 
     declare i int default 1;
     while i<800
     do 
          insert into ts1 select RAND()*80000,RAND()*80000;
          set i=i+1;
     end while;
     commit;
end //
DELIMITER ;

call ts_insert();

分析效率:

explain select * from ts1 order by a,b desc limit 5;

在这里插入图片描述
可以看到一共就执行了5行,如果这里不支持降序索引的话,他就会按照升序的索引进行查找,那得多慢啊.

这里还由一点得注意一下,就是索引得升降序和查找数据得升降序应该对应起来:
在这里插入图片描述
如果不对应得话,效率也是极低的:
在这里插入图片描述

4.2 隐藏索引

在MySQL 5.7 之前,只能通过显式的方式创建索引。此时,如果发现删除索引之后出现错误,又只能将索引创建回来,如果数据量比较大的话,这种方式就是极其小号资源的。

在MySQL 8之后,就开始支持 隐藏索引(invisible indexes),只需要将删除的索引设置为隐藏索引,是查询优化器不再使用这个索引,确定设设置为隐藏索引之后操作不受影响,就可以直接将该索引彻底删除,这种先将索引设置为隐藏索引,再删除索引的方式就是软删除

同时,你如果向验证删除某个索引之后的查询执行效率,就可以先暂时隐藏该索引。

1. 创建隐藏索引的方式

  1. 创建表时
create table book4(
book_id int,
book_name varchar(100),
authors varchar(100),
info varchar(100),
comment varchar(100),
year_publication year,
index idx_cmt(comment) invisible -- 设置comment为隐藏索引
);
  1. 创建表后
alter table book4 add unique index uk_idx_bname(book_name) inviaible;
create unique index uk_idx_bname on book4(book_name) invisible;

2. 修改索引是否隐藏

将uk_idx_bname 修改为可见状态

alter table book4 alter index uk_idx_bname visible;

注意:

当索引被隐藏之后,它的索引状态仍然会实时更新。如果一个索引被长期隐藏,那么可以先将其删除,因为索引的存在会影响 增删改 的性能

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

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

相关文章

基于java(ssm)家教管理平台(java毕业设计)

基于java&#xff08;ssm&#xff09;家教管理平台 家教管理&#xff0c;是基于java变成语言&#xff0c;mysql数据库&#xff0c;ssm框架和idea工具开发&#xff0c;本系统分为用户&#xff0c;管理员&#xff0c;教师三个角色&#xff0c;其中用户可以注册&#xff0c;登陆&…

网络工程师之海明校验

海明校验&#xff08;又称汉明码&#xff09; 基本思想 将有效信息按某种规律分成若干组&#xff0c;每组安排一个校验位&#xff0c;做奇偶测试&#xff0c;就能提供多位检错信息&#xff0c;以指出最大可能是哪位出错&#xff0c;从而将其纠正。 特点 它不仅具有检测错误的…

深入浅出网络编程TCP,UDP,Socket,Http网络编程面试题

目录 什么是网络编程 网络编程中的主要问题 计算机网络体系结构 TCP / UDP Socket HTTP 什么是网络编程 网络编程中的主要问题 计算机网络体系结构 OSI参考模型 OSI&#xff08;Open System Interconnect&#xff09;&#xff0c;即开放式系统互联。一般都叫OSI参考模型&…

Geoserver提示HTTP ERROR 503 Service Unaviaiable以及Context initialization failed

场景 GeoServer简介、下载、配置启动、发布shapefile全流程(图文实践)&#xff1a; GeoServer简介、下载、配置启动、发布shapefile全流程(图文实践)_霸道流氓气质的博客-CSDN博客_geoserver简介 geoserver版本为2.19.2&#xff0c;在windows10系统中正常启动并运行后&#…

教程篇 | 史上最简单也最全新手Revit教程

Hi&#xff0c;朋友们&#xff0c;我是建模助手。 近期发现&#xff0c;后台留言的画风日渐扭曲&#xff0c;很多用户的私信内容不仅跟有求必应无关&#xff0c;甚至跟建模助手也无关&#xff0c;而是关于Revit的问题。&#xff08;这就很离谱了&#xff09; 但后来小编也算是…

MySQL数据库入门到精通,从mysql安装到mysql高级、mysql优化全囊括

1、存储引擎 1.1、MySQL体系结构 连接层&#xff1a;最上层是一些客户端和链接服务&#xff0c;主要完成一些类似于连接处理、授权认证以及相关的安全方案。服务器也会为安全接入的每个客户端验证它所具有的操作权限。服务层&#xff1a;第二层架构主要完成大多数的核心服务功…

Qt6 qtmqtt编译及演示示例(附带动态库)

前言 随着物联网的不断发展&#xff0c;如今很多项目都需要接入&#xff0c;而两年前也是因为项目需要&#xff0c;了解了一些关于mqtt的用法&#xff0c;并将其过程记录成几篇博客&#xff0c;近一年多时间陆陆续续有好多人私信咨询关于mqtt相关的问题&#xff0c;其中又有很…

ReentrantLock源码分析AQS原理

目录 (一)AQS简介 (二)AQS原理剖析 (三)源码思想-加锁&#xff1a; (1)构造方法 (2)公平锁lock方法(核心) 3、acquire获取资源方法(核心) (一)AQS简介 AQS是AbstractQueuedSynchronizer的简称,是一种实现阻塞锁和依赖FIFO队列的同步器框架。其依赖于一个原子变量state,子…

Unity Text Mesh Pro 浮动文字-学习

TextMeshPro&#xff08;TMP&#xff09;是unity的一套UI文字方案&#xff0c;支持对顶点、颜色进行编辑&#xff0c;自定义强&#xff0c;可扩展等优点。 对于英文数字即字符只需制作ASCII的文件即可&#xff0c;但是对于中文&#xff0c;如果我们的文字需要动态生成且不可控…

k8s教程(19)-pod之批处理调度

文章目录01 引言02 批处理调度2.1 任务模式分类2.1.1 按实现方式分类2.1.2 按批处理并行分类2.1 案例2.1.1 Job Template Expansion案例2.1.2 Queue with Pod Per Work Item案例2.1.3 Queue with Variable Pod Count案例03 文末01 引言 声明&#xff1a;本文为《Kubernetes权威…

思维方式之系统思维

这世界上的所有事物&#xff0c;都被规律作用着&#xff0c;以一种叫作“系统”的方式存在着。 我们身处时代这个大系统之中&#xff0c;如果没有一种全局的系统观&#xff0c;很容易就会和机遇失之交臂。凡事要顺势而为&#xff0c;用“个位”的管理对抗“千位”的时代&#…

精华推荐 |【Redis技术探索】「底层架构原理」深入透析主从架构的底层原理分析实现机制

&#x1f4d5;技术箴言 当心中有更高的山峰去攀登&#xff0c;就不会在意脚下的泥沼。 &#x1f4d5;前提概要 Redis高可用的方案包括&#xff1a;持久化、主从复制&#xff08;及读写分离&#xff09;、哨兵和集群&#xff08;Cluster&#xff09;。 &#x1f4d5;&#x1f…

音视频面试涨知识(四)

视频格式播放体验流量占用情况DASH统计直播推流端到播放端延时。支持和视频帧绑定的内容交互。比如&#xff0c;直播答题在播放端的弹窗等。小HLS对视频进行切片&#xff0c;按切片播放&#xff0c;缓存小起播快&#xff1b;拖动时间轴到任意时间播放时&#xff0c;可以快速定位…

dubbo2和dubbo3 入门简介

稳定版本:2.5.3 目前已恢复更新Apache Dubbo 是一款微服务框架,为大规模微服务实践提供高性能 RPC通信、流量治理、可观测性等解决方案, 涵盖 Java、Golang 等多种语言 SDK 实现。3.0 版本的正式发布,标志着 Apache Dubbo 正式进入云原生时代。3.0 在通信协议、服务发现、部…

微服务框架 SpringCloud微服务架构 多级缓存 48 多级缓存 48.1 初识OpenResty

微服务框架 【SpringCloudRabbitMQDockerRedis搜索分布式&#xff0c;系统详解springcloud微服务技术栈课程|黑马程序员Java微服务】 多级缓存 文章目录微服务框架多级缓存48 多级缓存48.1 初识OpenResty48.1.1 初识OpenResty48.1.2 安装OpenResty48 多级缓存 48.1 初识Open…

python 使用tk报错

文章目录Preface解决方法问题1:问题2: **tk.Tk()** 这里的 Tk 的 k 是小写错误信息 ~~并没有什么实际作用/提示~~Preface 最近刚开始学习用python 的时候遇到一个对于我这样的新手来说比较棘手的问题. 我查询了好久, 大多数给出的答案就是代码写错了 而且是不给错误行数的那种…

微服务框架 SpringCloud微服务架构 多级缓存 48 多级缓存 48.3 请求参数处理

微服务框架 【SpringCloudRabbitMQDockerRedis搜索分布式&#xff0c;系统详解springcloud微服务技术栈课程|黑马程序员Java微服务】 多级缓存 文章目录微服务框架多级缓存48 多级缓存48.3 请求参数处理48.3.1 OpenResty获取请求参数48.3.2 直接上案例48 多级缓存 48.3 请求…

Service 与 Pod 有什么联系?

目录前言一、创建 Deployment二、创建 Service三、集群外部访问前言 首先我们要清楚&#xff0c;Pod 中的容器很可能因为各种原因故障而死掉&#xff0c;如果真的发生故障&#xff0c;那 Deployment 等 Controller 会通过动态创建和销毁 Pod 来保证应用整体的健壮性。而每个 P…

java的垃圾回收浅谈

目录 并发标记问题 三色算法问题 浮动垃圾问题 漏标问题 cms的解决方式 g1的解决方式 跨代(区)引用 CMS垃圾回收日志 G1垃圾回收日志 垃圾回收过程其实都包含两步&#xff1a;标记回收。 标记算法&#xff1a; 引用计数&#xff1a;每个对象都有一个计数器&#xff…

【大数据技术Hadoop+Spark】Hive基础SQL语法DDL、DML、DQL讲解及演示(附SQL语句)

Hive基础SQL语法 1&#xff1a;DDL操作 DDL是数据定义语言&#xff0c;与关系数据库操作相似&#xff0c; 创建数据库 CREATE DATABASE|SCHEMA [IF NOT EXISTS] database_name显示数据库 SHOW databases&#xff1b;查看数据库详情 DESC DATABASE|SCHEMA database_name切…