头歌实训之索引

 

🌟 各位看官好,我是maomi_9526

🌍 种一棵树最好是十年前,其次是现在!

🚀 今天来学习C语言的相关知识。

👍 如果觉得这篇文章有帮助,欢迎您一键三连,分享给更多人哦

目录

第1关:创建一般索引

第2关:删除索引-练习

第3关:创建联合索引

第4关:创建唯一索引

第5关:创建前缀索引


第1关:创建一般索引

任务描述
本关任务:为 student 表按姓名升序建立索引,索引名为 idx_sname。

相关知识
为了完成本关任务,你需要掌握:

  1. 索引是什么;
  2. 索引的分类;
  3. 索引的创建和删除;
  4. 查询索引。

索引是什么
数据库索引是一种提高数据库系统性能的方法。索引能让数据库服务器更快地查找和获取表中指定的行。

例如,为了方便读者快速查找书中的术语,很多书籍在最后附加了索引页,术语按字母排序,同时给出页码。这样读者可以根据术语名,快速获取页码,而不用翻阅整本书。

但是索引也给数据库系统带来了一定的开销,所以我们应该谨慎地使用它们。

索引的分类
索引大体可分为单列索引(普通索引,唯一索引,主键索引)、组合索引、全文索引、空间索引四类。本实训我们主要介绍单例索引和组合索引:

  • 单例索引:一个索引只包含单个列,但一个表中可以有多个单列索引;
  • 普通索引:仅加速查询 最基本的索引,没有任何限制,是我们大多数情况下使用到的索引;
  • 唯一索引:索引列中的值必须是唯一的,但允许为空值;
  • 主键索引:是一种特殊的唯一索引,不允许有空值。
  • 组合索引:在表的多个字段上创建的索引,只有在查询条件中使用了这些字段的左边字段时,索引才会被使用,使用组合索引时遵循最左前缀集合。

索引的创建和删除
创建索引
创建索引有两种方式,一种是在建表时创建,另一种是建表后创建:

普通索引:
创表时创建普通索引:

CREATE table mytable(
 id INT NOT NULL,
 username VARCHAR(16) NOT NULL,
 INDEX [indexName] (username)
);


建表后创建普通索引:

create INDEX 索引名称 on 表名(字段名 desc/asc);

#或者
ALTER TABLE 表名 ADD INDEX 索引名称 (字段名);
asc 代表升序索引,desc 代表降序,mysql 默认升序索引。

唯一索引:

CREATE UNIQUE INDEX 索引名称 ON 表名(字段名);

#或者
ALTER TABLE 表名 ADD UNIQUE (字段名);

主键索引:

主键索引一般在建表时创建,会设为 int 而且是 AUTO_INCREMENT 自增类型的,例如一般表的 id 字段。

CREATE TABLE mytable (
  id int(11) NOT NULL AUTO_INCREMENT,
  PRIMARY KEY (id)
);


组合索引:

组合索引就是在多个字段上创建一个索引。(应用场景:当表的行数远远大于索引键的数目时,使用这种方式可以明显加快表的查询速度)

CREATE INDEX 索引名称 ON 表名(字段1,字段2,字段3);

ALTER TABLE 表名 ADD INDEX 索引名称(字段1,字段2,字段3);

查询表中索引
查询索引 SQL:

show index from 表名;
编程要求
在右侧编辑器补充代码,要求如下:

  • 为 student 表按姓名升序建立索引,索引名为 idx_sname。

测试说明
平台会对你编写的代码进行测试,将你所创建的索引都现实出来,具体现实效果请查看右侧测试集。


开始你的任务吧,祝你成功!

 use teachingdb;/****请在此编写代码,操作完毕之后点击评测******//**********Begin**********/create index idx_sname on student(sname);/**********End**********/show index from student;

第2关:删除索引-练习

任务描述
本关任务:删除索引。

相关知识
删除索引
同样,删除索引也有两种方式。

#使用drop删除索引
drop index index_name on table_name ;

#使用alter删除索引
alter table table_name drop index index_name ;


alter table table_name drop primary key ; #删除主键索引

编程要求
根据提示,在右侧编辑器补充代码,删除索引 idx_sname。

测试说明
编写代码后,点击测评即可。


开始你的任务吧,祝你成功!

 use teachingdb;/****请在此编写代码,操作完毕之后点击评测******//**********Begin**********/
drop index idx_sname on student;/**********End**********/show index from student;

第3关:创建联合索引

任务描述
本关任务:创建联合索引 idx_sname_sdept。

相关知识
为了完成本关任务,你需要掌握:如何创建联合索引。

创建联合索引

语法:
create index 索引名称 on 表名(字段名称)

示例:
create index idx_name_age on student( name,age);

联合索引的使用规则

  • 最左前缀原则: 联合索引的查询效率依赖于索引列的顺序。查询时,必须从联合索引的最左边的列开始匹配,否则索引可能不会被使用。例如,对于索引idx_name_age:
    • 查询条件WHERE name = 'Alice' AND age = 20会使用索引。
    • 查询条件WHERE age = 20 AND name = 'Alice'也会使用索引(因为MySQL会自动优化)。
    • 查询条件WHERE age = 20不会使用索引,因为没有从最左边的列name开始。
  • 部分列的使用: 如果查询条件只使用了联合索引的一部分列(从最左边开始),索引仍然可以被部分使用。例如:
    • 查询条件WHERE name = 'Alice'会使用索引,但只会利用name这一部分。
  • 排序和范围查询:联合索引在排序和范围查询中也非常有效。例如:

SELECT * FROM students WHERE name = 'Alice' ORDER BY age;

编程要求
根据任务完成代码编写,将代码补充在右侧编辑器中: (1)在 student 表 sname 字段和 sdept 字段上创建联合索引 idx_sname_sdept; (2)编写一个只利用联合索引进行查询的例子(使用EXPLAIN 分析)。
测试说明
编写代码后,点击测评即可。


开始你的任务吧,祝你成功!

 use TeachingDb;/****请在此编写代码,操作完毕之后点击评测******//**********Begin**********//**********创建索引idx_sname_sdept**********/ 
create index idx_sname_sdept on student(sname,sdept);/**********应用举例**********/ 
EXPLAIN select sname,sdept from student where sname='马小燕' and sdept='计算机';/**********End**********/

第4关:创建唯一索引

任务描述
本关任务:创建唯一索引 uk_cname。

相关知识
为了完成本关任务,你需要掌握:如何创建唯一索引。

如何创建唯一索引

语法:

create unique index 索引名称 on 表名(字段名称);

示例:

create unique index secondIndex on student(name, address);

注意:

  • 索引名称、表名、字段名称 都不要用引号括起来;
  • 对于联合索引而言,字段名称可以有多个,中间用英文逗号分隔即可;
  • 唯一索引数据不可重复。

编程要求
在 course 表的 cname 字段上创建唯一索引 uk_cname ,并将代码补充在右侧编辑器中。

测试说明
编写代码后,点击测评即可。


开始你的任务吧,祝你成功!

 use TeachingDb;/****请在此编写代码,操作完毕之后点击评测******//**********Begin**********/create unique index uk_cname on course (cname);/**********End**********/show index from course;

第5关:创建前缀索引

任务描述
本关任务:创建前缀索引。

相关知识
前缀索引是基于列的前缀值创建的索引。例如,对于一个VARCHAR(255)类型的列,你可以选择只对前n个字符建立索引。这样,索引的大小会显著减小,但仍然可以在一定程度上提高查询性能。

创建前缀索引
创建前缀索引的两种方式

//1.使用CREATE INDEX语句
CREATE INDEX index_name ON table_name (column_name (length));

//2.使用ALTER TABLE语句
ALTER TABLE table_name ADD INDEX (column_name (length));

确定length的取值算法
确定length的SQL语句:

SELECT COUNT(DISTINCT LEFT(column_name,length))/COUNT(column_name) 
FROM table_name;

length的取值从1逐步增加,当查询返回的值为1或不再发生变化时,length的值就是前缀索引的合理取值。

编程要求
在 course 表的 cname 字段上创建前缀索引 pidx_cname,并将代码补充在右侧编辑器中:
(1)测试cname前缀索引length的合理取值;
(2)创建前缀索引 pidx_cname。

测试说明
编写代码后,点击测评即可。


开始你的任务吧,祝你成功!

 use TeachingDb;/****请在此编写代码,操作完毕之后点击评测******//**********Begin**********//**********测试cname字段前缀索引的合理取值**********/ 
select COUNT(DISTINCT LEFT(cname,4))/COUNT(cname) from course;/**********创建前缀索引pidx_cname**********/ create index pidx_cname on course(cname(4));/**********End**********/
show index from course;

任务描述
本关任务:创建全文索引 ft_cname 。

相关知识
全文索引(Full-Text Index) 是一种用于高效检索文本内容中关键词或短语的数据库索引技术。它与传统的 B-Tree 索引不同,能够支持自然语言搜索(如模糊匹配、分词、相关性排序等),适用于对长文本内容进行复杂查询的场景。

全文索引(Full-Text Index)是一种专门用于快速搜索文本内容的索引类型,通常在需要对大量文本数据进行全文搜索的场景中使用。在 MySQL 中,全文索引主要用于 TEXT 字段,但 VARCHAR 在特定场景下也可支持。

创建全文索引
创建全文索引的两种方式

//1.CRATE INDEX添加
CREATE FULLTEXT INDEX index_name ON table_name (column1,column2,...);

//2.ALTER添加
ALTER TABLE table_name ADD FULLTEXT INDEX index_name (column1,column2,...);

使用全文索引
使用全文索引的方式

SELECT * FROM 表名 WHERE MATCH(字段) AGAINST('查询文本') ;

编程要求
若在 student 表的remarks字段上以文本的形式存储学生的备注信息,在remarks字段上创建全文索引 ft_remarks,并检索是“学生干部”的学生信息,将代码补充在右侧编辑器中。

测试说明
编写代码后,点击测评即可。


开始你的任务吧,祝你成功!

 use TeachingDb;/****请在此编写代码,操作完毕之后点击评测******//**********Begin**********/
/**********(1)创建全文索引ft_remarks**********/ 
create fulltext index  ft_remarks on student (remarks);
/**********(2)显示student表上的索引**********/ 
show index from student;
/**********(3)检索“学生干部”的学生姓名和备注信息**********/ 
select sname,remarks from student where match(remarks)against('学生干部');/**********End**********/

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

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

相关文章

第25周:DenseNet+SE-Net实战

目录 前言 1.准备工作 2.查看数据 3.划分数据集 4.创建模型 5.编译及训练模型 6.结果可视化 7.总结 前言 🍨 本文为🔗365天深度学习训练营中的学习记录博客🍖 原作者:K同学啊 1.准备工作 import torch import torch.nn as nn imp…

什么是Maven

Maven的概念 Maven是一个一键式的自动化的构建工具。Maven 是 Apache 软件基金会组织维护的一款自动化构建工具,专注服务于Java 平台的项目构建和依赖管理。Maven 这个单词的本意是:专家,内行。Maven 是目前最流行的自动化构建工具&#xff0…

VSCode如何修改默认扩展路径和用户文件夹目录到其他盘以及微信开发工具如何修改扩展路径到其他盘

ps:因公司电脑c盘内存严重不足,而出本篇文章 1.Visual Studio Code 随着VsCode的使用时间的推移,安装的扩展以及数据逐步增多,导致c盘内存占用较大,所以这里将vscode的默认缓存路径等迁移到其他盘。 步骤如下 1.找到默认的存储…

【LLM+Code】Github Copilot Agent/VsCode Agent 模式PromptTools详细解读

一、前言 github copilot agent mode现在和vscode是强绑定的关系, 其实是一个东西: https://github.blog/news-insights/product-news/github-copilot-the-agent-awakens/https://code.visualstudio.com/docs/copilot/chat/chat-agent-mode 二、Syste…

Ubuntu服务器上如何监控Oracle数据库

在 Ubuntu 服务器上监控 Oracle 数据库,虽然不像在 Windows 或某些企业 Linux(如 RHEL)那样有现成的 GUI 工具,但你完全可以通过命令行工具、脚本、开源监控平台来实现全面监控,包含: 数据库性能指标&#…

系统高性能设计核心机制图解:缓存优化、链表调度与时间轮原理

系统高性能设计核心机制图解:缓存优化、链表调度与时间轮原理 在高并发系统中,性能瓶颈常出现在内存竞争、调度延迟与缓存失效等环节。本文总结几项关键机制:伪共享优化、链表缓存结构、时间轮定时器,并通过文字图示还原其结构与…

Spark-Streaming核心编程

Kafka命令行的使用 创建topic kafka-topics.sh --create --zookeeper node01:2181,node02:2181,node03:2181 --topic test1 --partitions 3 --replication-factor 3 分区数量,副本数量,都是必须的。 数据的形式: 主题名称-分区编号。 在…

Spring AI - Redis缓存对话

先看效果 对话过程被缓存到了Redis 中。 原理 在上一节我们快速入门了SpringAI,具体文章请查看:快速入门Spring AI 创建 ChatClient 的代码如下: this.chatClient ChatClient.builder(chatModel).defaultSystem(DEFAULT_PROMPT).defaultAd…

图像预处理-模板匹配

就是用模板图在目标图像中不断的滑动比较,通过某种比较方法来判断是否匹配成功,找到模板图所在的位置。 - 不会有边缘填充。 - 类似于卷积,滑动比较,挨个比较象素。 - 返回结果res大小是:目标图大小-模板图大小1(H-…

【算法笔记】动态规划基础(一):dp思想、基础线性dp

目录 前言动态规划的精髓什么叫“状态”动态规划的概念动态规划的三要素动态规划的框架无后效性dfs -> 记忆化搜索 -> dp暴力写法记忆化搜索写法记忆化搜索优化了什么?怎么转化成dp?dp写法 dp其实也是图论首先先说结论:状态DAG是怎样的…

网络原理————HTTP

1,HTTP简介 我们上一期谈到了网络编程尤其是TCP和UDP,使用网络套接字来实现网络编程,上一期忘记说了,我们使用TCP的时候,我们用了线程池,这样就可以处理很多客户端而不会阻塞,那么如果客户端一…

rust编程学习(三):8大容器类型

1简介 rust标准库std::collections也提供了像C STL库中的容器&#xff0c;分为4种通用的容器&#xff0c;8种类型&#xff0c;如下表所示。 线性容器类型&#xff1a; 名称简介Vec<T>内存空间连续&#xff0c;可变长度的数组&#xff0c;类似于C中Vector<T>容器…