【Linux】Mysql之索引的基本操作

news2025/1/21 21:58:56

一、为什么要使用索引

        索引就是根据表中的一列或若干列按照一定顺序建立的列值与记录行之间的对应关系表,实质上是一张描述索引列的列值与原表中记录行之间一 一对应关系的有序表。

        索引是 MySQL 中十分重要的数据库对象,是数据库性能调优技术的基础,常用于实现数据的快速检索。

        在 MySQL 中,通常有以下两种方式访问数据库表的行数据:


顺序访问

        顺序访问是在表中实行全表扫描,从头到尾逐行遍历,直到在无序的行数据中找到符 合条件的目标数据。 顺序访问实现比较简单,但是当表中有大量数据的时候,效率非常低下。例如,在几 千万条数据中查找少量的数据时,使用顺序访问方式将会遍历所有的数据,花费大量 的时间,显然会影响数据库的处理性能。

索引访问

        索引访问是通过遍历索引来直接访问表中记录行的方式。
        使用这种方式的前提是对表建立一个索引,在列上创建了索引之后,查找数据时可以直接根据该列上的索引找到对应记录行的位置,从而快捷地查找到数据。索引存储了指定列数据值的指针,根据指定的排序顺序对这些指针排序。
        例如,在学生基本信息表 tb_students 中,如果基于 student_id 建立了索引,系统就建立了一张索引列到实际记录的映射表。当用户需要查找 student_id 为 12022 的数据的时候,系统先在 student_id 索引上找到该记录,然后通过映射表直接找到数据行,并且返回该行数据。因为扫描索引的速度一般远远大于扫描实际数据行的速度,所以采用索引的方式可以大大提高数据库的工作效率。


        简而言之,不使用索引,MySQL 就必须从第一条记录开始读完整个表,直到找出相的行。表越大,查询数据所花费的时间就越多。如果表中查询的列有一个索引,MySQL 就能快速到达一个位置去搜索数据文件,而不必查看所有数据,这样将会节省很大一部分时间。

二、索引的优缺点

索引有其明显的优势,也有其不可避免的缺点。

1、索引的优点

索引的优点如下:

  • 通过创建唯一索引可以保证数据库表中每一行数据的唯一性。
  • 可以给所有的 MySQL 列类型设置索引。
  • 可以大大加快数据的查询速度,这是使用索引最主要的原因。
  • 在实现数据的参考完整性方面可以加速表与表之间的连接。
  • 在使用分组和排序子句进行数据查询时也可以显著减少查询中分组和排序的时间
     

2、索引的缺点

增加索引也有许多不利的方面,主要如下:

  • 创建和维护索引组要耗费时间,并且随着数据量的增加所耗费的时间也会增加。
  • 索引需要占磁盘空间,除了数据表占数据空间以外,每一个索引还要占一定的物 理空间。如果有大量的索引,索引文件可能比数据文件更快达到最大文件尺寸。
  • 当对表中的数据进行增加、删除和修改的时候,索引也要动态维护,这样就降低 了数据的维护速度。

使用索引时,需要综合考虑索引的优点和缺点。

        索引可以提高查询速度,但是会影响插入记录的速度。因为,向有索引的表中插入记 录时数据库系统会按照索引进行排序,这样就降低了插入记录的速度,插入大量记 录时的速度影会更加明显。这种情况下,最好的办法是先删除表中的索引,然后插 入数据,插入完成后,创建索引。

三、按索引的存储方式区分

根据存储方式的不同,MySQL 中常用的索引在物理上分为 B-树索引HASH 索引两 类,两种不同类型的索引各有其不同的适用范围。

四、按索引的逻辑区分

1、普通索引

普通索引是 MySQL 中最基本的索引类型,它没有任何限制,唯一任务就是加快系统 对数据的访问速度。

普通索引允许在定义索引的列中插入重复值和空值。 创建普通索引时,通常使用的关键字是 INDEX 或 KEY。


下面在 tb_student 表中的 id 字段上建立名为 index_id 的索引。

CREATE INDEX index_id ON tb_student(id);

2、唯一索引

        唯一索引与普通索引类似,不同的是创建唯一性索引的目的不是为了提高访问速度,而是为了避免数据出现重复。
        唯一索引列的值必须唯一,允许有空值。如果是组合索引,则列值的组合必须唯一。创建唯一索引通常使用 UNIQUE 关键字


下面在 tb_student 表中的 id 字段上建立名为 index_id 的索引,SQL 语句如下:

CREATE UNIQUE INDEX index_id ON tb_student(id);

3、主键索引

        顾名思义,主键索引就是专门为主键字段创建的索引,也属于索引的一种。

        主键索引是一种特殊的唯一索引,不允许值重复或者值为空

        创建主键索引通常使用 PRIMARY KEY 关键字不能使用 CREATE INDEX 语句创建主键索引。

4、空间索引(了解一下)

空间索引是对空间数据类型的字段建立的索引,使用 SPATIAL 关键字进行扩展。

创建空间索引的列必须将其声明为 NOT NULL空间索引只能在存储引擎为MyISAM 的表中创建。

空间索引主要用于地理空间数据类型 GEOMETRY。对于初学者来说,这类索引很少会用到。


下面在 tb_student 表中的 line 字段上建立名为 index_line 的索引,SQL 语句如下:

CREATE SPATIAL INDEX index_line ON tb_student(line);

其中,tb_student 表的存储引擎必须是 MyISAM,line 字段必须为空间数据类型, 而且是非空的。

5、全文索引(了解一下)

全文索引主要用来查找文本中的关键字只能在 CHAR、VARCHAR 或 TEXT 类型的列上创建。在 MySQL 中只有 MyISAM 存储引擎支持全文索引

全文索引允许在索引列中插入重复值和空值。

不过对于大容量的数据表,生成全文索引非常消耗时间和硬盘空间。

创建全文索引使用 FULLTEXT 关键字


在 tb_student 表中的 info 字段上建立名为 index_info 的全文索引,SQL 语句如 下:

CREATE FULLTEXT INDEX index_info ON tb_student(info);

其中,index_info 的存储引擎必须是 MyISAM,info 字段必须是 CHAR、VARCHAR 和TEXT 等类型。


五、添加索引

1、添加普通索引:

语法:

create index 索引名 on 表名(作为索引的字段);


create index index_id on students(id);

2、添加唯一索引:

语法:

 create unique index 索引名 on 表名(作为索引的字段);


① 创建唯一索引

create unique index u_index_id on students(id);

 ② 查看索引;

3、添加主键索引:

语法:

alter table 表名 add primary key 索引名 (表中的字段);


alter table students add primary key pri_index (name);

【将students 表中的name字段作为主键索引,索引名为 pri_index】

六、显示表中的索引

语法:

 show indexes from 表名;


① 显示所有的数据库;

② 切到数据库;

③ 查看Class_Linux数据库中的表;

④ 查看students表中的索引;

 show indexes from students;

Table 表的名称。
Non_unique    如果索引不能包括重复词,则为0。如果可以,则为1。
Key_name  索引的名称。
Seq_in_index索引中的列序列号,从1开始。
Column_name    列名称。
Collation列以什么方式存储在索引中。在MySQL中,有值‘A’(升序)或NULL(无分类)
Cardinality索引中唯一值的数目的估计值。通过运行ANALYZE TABLE或myisamchk -a可以更新。基数根据被存储为整数的统计数据来计数,所以即使对于小型表,该值也没有必要是精确的。基数越大,当进行联合时,MySQL使用该索引的机 会就越大。
Sub_part如果列只是被部分地编入索引,则为被编入索引的字符的数目。如果整列被编入索引,则为NULL。
Packed指示关键字如何被压缩。如果没有被压缩,则为NULL。
Null如果列含有NULL,则含有YES。如果没有,则该列含有NO。
Index_type用过的索引方法(BTREE, FULLTEXT, HASH, RTREE)。

    

七、删除索引

1、删除非主键索引

语法:

 alter table 表名 drop index 索引名;


 alter table students drop index index_id;

① 查看索引;

② 删除索引;

③ 查看是否删除成功;

2、删除主键索引

语法:

alter table students drop PRIMARY KEY;


① 查看students表的索引

 ② 删除主键索引

 ③ 查看是否删除成功

 删除成功

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

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

相关文章

GraphCL方法介绍(Graph Contrastive Learning with Augmentations)

论文链接:https://arxiv.org/pdf/2010.13902.pdf 附录链接:https://yyou1996.github.io/files/neurips2020_graphcl_supplement.pdf 代码链接:https://github.com/Shen-Lab/GraphCL 1 图的数据增强 我们专注于图级扩充。给定 M 个图的数…

【分布式】熔断、降级傻傻分不清楚-熔断和降级的真实关系

文章目录前言降级熔断什么是服务熔断熔断和降级的关系降级方式1、熔断降级(不可用)2、超时降级3、限流降级总结前言 刚开始我以为熔断和降级是一体的,以为他们必须配合使用; 只不过名字不一样而已,但是当我经过思考过…

[架构之路-164]-《软考-系统分析师》-3-操作系统基本原理-文件系统(文件的逻辑组织、文件的物理组织、硬盘空间管理、分布式文件系统)

目录 3 . 4 文件系统 3.4.1文件的组织结构 1 . 逻辑结构 2 . 物理结构 3 . 树形文件结构 3.4.2 硬盘存储空间管理 1 . 空闲文件目录 2 . 空闲块链 3 . 位示图法 4 . 成组链接法 3.4.3分布式文件系统 1. D F S 的特点 2. DFS 的组成 3. DFS 的架构 3 . 4 文件系统…

腾讯云服务器TencentOS系统安装宝塔Linux面板命令

腾讯云服务器TencentOS Server操作系统安装宝塔Linux面板命令选择CentOS安装脚本即可,TencentOS用户态环境与CentOS保持兼容,在CentOS上开发的应用程序可直接在TencentOS Server上运行。腾讯云百科分享腾讯云服务器TencentOS操作系统安装宝塔Linux面板命…

客户端ack模块的实现

文章目录背景第一版设计第二版设计第三、四版设计写在最后背景 所谓客户端ack模块是在我们推送服务中一个技术需求,本文主要介绍其迭代过程。 首先简单介绍下推送服务的架构,如下图。用户请求ws服务,建立ws长连接,并通过login和…

类和对象(C++11)

目录 一、类的定义 1.定义与声明放一起 2.定义与声明分开 二、类的访问限定符及封装 1.类的访问限定符 2.类的封装 三、类的实例化 四、类对象 1.类对象的存储方式 2.计算类对象的大小 面试题 1.结构体怎么对齐? 为什么要进行内存对齐? 2.如…

Python数据结构与算法-树

一、树的概念详情见 https://blog.csdn.net/little_limin/article/details/129845592 Python数据结构与算法-堆排序(NB组)—— 一、树的基础知识二、树的实例:模拟文件系统1、树的存储树结构也是链式存储的,与链表的结构相似&…

java通过URLClassLoader类加载器加载外部jar

相信在实际工作中,大家可能会遇到这种需求,这个jar是外部的,并没有添加到项目依赖中,只能通过类加载器加载并调用相关方法。 这种jar加载,其实也简单,我们通过普通的URLClassLoader就可以加载。代码如下所示…

netfilter filter表

iptables是linux下常用的一个防火墙软件,可以实现对网络访问的各种限制。iptables相当于防火墙的客户端,与用户进行交换,其后台依赖于内核的netfilter模块。iptables的各种配置,最终都是netfilter模块来实现的。 iptables分为4个…

Python-DQN代码阅读(12)

目录 1.代码 1.1代码解读 1.2 代码分解 1.2.1 latest_checkpoint tf.train.latest_checkpoint(checkpoint_dir) 1.2.2 saver.restore(sess, latest_checkpoint) 1.2.3 sess.run(tf.global_variables_initializer()) 1.2.4 deep_q_learning() 1.3 输出结果 1.4 问题 1…

v-for比v-if优先级更高?

前言 v-if和v-for哪个优先级更高呢?这是面试官常常问到的一个问题,如果是在三年前,我会毫不犹豫的回答当然是v-for哩,但在3202的今天,如果还这么答,显然是低估了前端技术的日新月异啰。下面我们就来结合编…

第十四届蓝桥杯大赛软件赛省赛 C/C++ 大学 A 组 E 题

颜色平衡树问题描述格式输入格式输出样例输入样例输出评测用例规模与约定解析参考程序问题描述 格式输入 输入的第一行包含一个整数 n ,表示树的结点数。 接下来 n 行,每行包含两个整数 Ci , Fi,用一个空格分隔,表示第 i 个结点 …

动态内存管理【下篇】

文章目录⚙️5.C/C程序的内存开辟⚙️6.柔性数组🔔6.1.柔性数组的特点🔔6.2.柔性数组的使用⚙️5.C/C程序的内存开辟 C/C程序内存分配的几个区域: 🔴1.栈区(stack):在执行函数时,函数…

2023软件测试最难求职季,哪些测试技能更容易拿到offer?

在一线大厂,没有测试这个岗位,只有测开这个岗位。这几年,各互联网大厂技术高速更新迭代,软件测试行业也正处于转型期。传统的功能测试技术逐步淘汰,各种新的测试技术层出不穷,测试人员的薪资也水涨船高。与…

【刷题之路】LeetCode 2389. 和有限的最长子序列

【刷题之路】LeetCode 2389. 和有限的最长子序列一、题目描述二、解题1、方法——二分法1.1、思路分析1.2、代码实现一、题目描述 原题连接: 2389. 和有限的最长子序列 题目描述: 给你一个长度为 n 的整数数组 nums ,和一个长度为 m 的整数数…

UR5构型机械臂正逆运动学

前言 整理之前的一个项目,当时看着一个博客硬生生计算了差不多一个星期。尝试用MatLab符号推导工具箱化简一部分工作。我使用的大象机器人一款开源入门级协作机器人产品myCobot,开发文档十分完善,但是有部分技术没有开源,如正逆运…

数据分析师 ---- SQL强化(2)

数据分析师 ---- SQL强化(2) 文章目录数据分析师 ---- SQL强化(2)题目一:SQL实现文本处理题目二:语种播放量前三高所有歌曲总结:题目一:SQL实现文本处理 现有试卷信息表examination_info(exam_id试卷ID, tag试卷类别,…

钢铁侠材质制作——2、线条轮廓部分的制作

钢铁侠Unlit光照Shader,三种效果变化返回目录大家好,我是阿赵,这里是钢铁侠材质制作第二部分,线条轮廓部分的制作 为了实现这个效果,可以把细节拆分成以下几个部分: 1、轮廓光 1.效果分析 这是一个很基…

时间序列 | MATLAB实现CNN-BiLSTM-Attention时间序列预测

时间序列 | MATLAB实现CNN-BiLSTM-Attention时间序列预测 目录时间序列 | MATLAB实现CNN-BiLSTM-Attention时间序列预测预测效果基本介绍模型描述程序设计参考资料预测效果 基本介绍 MATLAB实现CNN-BiLSTM-Attention时间序列预测,CNN-BiLSTM结合注意力机制时间序列预…