MySQL——索引管理

news2024/12/23 12:08:18

目录

一、索引的概述

1、索引的概念

2、索引的作用

3、索引的副作用

4、创建索引的原则依据

5、索引的分类

二、索引的管理

1、查看索引

2、创建索引

2.1、创建普通索引

2.2、创建唯一索引

2.3、创建主键索引

2.4、创建组合索引

2.5、创建全文索引

3、删除索引

3.1、直接删除索引

3.2、修改表格式方式删除索引

3.3、删除主键索引

一、索引的概述

1、索引的概念

  • 索引是一个排序的列表,在这个列表中存储着索引的值和包含这个值的数据所在行的物理地址(类似于C语言的链表通过指针指向数据记录的内存地址)。
  • 使用索引后可以不用扫描全表来定位某行的数据,而是先通过索引表找到该行数据对应的物理地址然后访问相应的数据,因此能加快数据库的查询速度。
  • 索引就好比是一本书的目录,可以根据目录中的页码快速找到所需的内容。
  • 索引是表中一列或者若干列值排序的方法。
  • 建立索引的目的是加快对表中记录的查找或排序

2、索引的作用

  • 加速查询:索引利用各种快速定位技术,如B树、哈希等,可以显著提高查询速度,尤其是在处理大型数据表或多表查询时,索引可以成千上万倍地提高查询速度。

  • 降低IO成本:索引减少了必须从磁盘读取的数据量,从而降低了IO操作的次数和成本。

  • 减少排序成本:在需要对数据进行排序的查询中,索引可以帮助数据库直接获取已经有序的数据,从而避免或减少排序操作。

  • 保证数据唯一性:通过创建唯一性索引(唯一键索引),可以确保数据表中的每一行数据都是唯一的,这在维护数据完整性方面非常重要。

  • 优化连接操作:索引可以加快表与表之间的连接操作,尤其是在使用外键进行连接时,索引可以显著提高连接查询的效率。

  • 减少分组和排序时间:在需要对数据进行分组和排序的查询中,索引可以减少这些操作所需的时间,因为索引本身可能已经按照需要的顺序组织了数据。

3、索引的副作用

  • 占用额外磁盘空间:索引需要存储额外的数据结构,这会占用数据库的磁盘空间。对于MyISAM引擎,索引文件和数据文件是分离的,索引文件用于保存数据记录的地址。而对于InnoDB引擎,表数据文件本身就是索引文件的一部分。

  • 增加插入和修改时间:在插入和修改数据时,索引也需要随之更新。这会导致这些操作的时间增加,因为数据库系统不仅要更新数据记录,还要维护索引的一致性。

  • 影响写操作性能:由于索引需要维护,频繁的插入、更新和删除操作可能会因为索引的更新而变得缓慢,尤其是在高并发的环境中。

  • 索引维护成本:随着数据量的增加,索引的维护成本也会增加。数据库系统需要定期重建或优化索引,以保持其效率。

  • 选择不当可能导致性能下降:如果索引选择不当,例如在不经常查询的列上创建索引,或者创建了过多的索引,可能会导致查询优化器选择不合适的索引,反而降低查询性能。

4、创建索引的原则依据

索引虽可以提升数据库查询的速度,但并不是任何情况下都适合创建索引。因为索引本身会消耗系统资源,在有索引的情况下,数据库会先进行索引查询,然后定位到具体的数据行,如果索引使用不当,反而会增加数据库的负担。

  • 表的主键、外键必须有索引。因为主键具有唯一性,外键关联的是子表的主键,查询时可以快速定位
  • 记录数超过300行的表应该有索引。如果没有索引,需要把表遍历一遍,会严重影响数据库的性能。
  • 经常与其他表进行连接的表,在连接字段上应该建立索引。
  • 唯一性太差的字段不适合建立索引。
  • 更新太频繁地字段不适合创建索引。
  • 经常出现在 where 子句中的字段,特别是大表的字段,应该建立索引。
  • select name,score from ky19 where id=1
  • 索引应该建在选择性高的字段上。
  • 索引应该建在小字段上,对于大的文本字段甚至超长字段,不要建索引。

5、索引的分类

普通索引(Normal Index)

  • 这是最基本的索引类型,适用于所有字段,没有特殊的需求或规则。

  • 可以创建在任何数据类型的字段上,用于加速查询,但不保证字段的唯一性。

唯一索引(Unique Index)

  • 针对具有唯一性要求的字段,确保字段的值在表中是唯一的。

  • 允许出现一次空值(NULL),因为NULL在SQL标准中被认为是不同于任何其他值的特殊值。

组合索引(Composite Index 或 Multi-column Index)

  • 由多个字段组合而成的索引,适用于需要同时根据多个字段进行查询的场景。

  • 组合索引的顺序很重要,查询时需要按照索引字段的顺序来使用索引,才能发挥其最大效能。

全文索引(Full-Text Index)

  • 专门为文本内容搜索设计的索引,适用于VARCHAR、CHAR、TEXT等文本类型的字段。

  • 全文索引可以优化对文本内容的搜索,支持关键词查询,适用于需要进行全文检索的应用场景。

主键索引(Primary Key Index)

  • 针对具有唯一性且不可为空(NOT NULL)的字段,通常用于标识表中的每一条记录。

  • 一张表中只能包含一个主键索引,主键索引隐含了唯一性和不可为空的约束。

二、索引的管理

1、查看索引

show create table cxc

show index from 表名;
show index from 表名\G;  //竖向显示表索引信息

show keys from 表名;
show keys from 表名\G;    //竖向显示表索引信息

解释: 

字段名称含义
Table表的名称
Non_unique如果索引内容唯一,则为 0;如果可以不唯一,则为 1。
Key_name索引的名称。
Seq_in_index索引中的列序号,从 1 开始。limit 2,3
Column_name列名称。
Collation列以什么方式存储在索引中。在 MySQL 中,有值‘A’(升序)或 NULL(无分类)。
Cardinality索引中唯一值数目的估计值。
Sub_part如果列只是被部分地编入索引,则为被编入索引的字符的数目。如果整列被编入索引,则为 NULL。
Packed指示关键字如何被压缩。如果没有被压缩,则为 NULL。
Null如果列含有 NULL,则含有 YES。如果没有,则该列含有 NO。
Index_type用过的索引方法(BTREE, FULLTEXT, HASH, RTREE)。
Comment备注。

2、创建索引

2.1、创建普通索引

最基本的索引类型,没有唯一性之类的限制。

方法一:直接创建索引

create index 索引名 on 表名 (列名);
create index score_index on xiaomi (score);
create index name_index on damo (name);

方法二:修改表的方式创建

alter table 表名 add index 索引名 (列名);
alter table cxc add index index_id (id);

方法三:创建表的时候指定索引

create table jjg (id int(10),name varchar(10),cardid varchar(18),phone varchar(11),address varchar(50),remark text,index index_carrdid(cardid));

2.2、创建唯一索引

唯一索引(Unique Index)在MySQL数据库中是一种确保数据列中每个值都是唯一的索引。通过创建唯一索引,你可以保证某一列或列组合中的数据值不会重复,这对于维护数据的完整性非常重要,如防止同一个电子邮件地址被注册多次

  • 与普通索引类似,但区别是唯一索引列的每个值都唯一。
  • 唯一索引允许有空值(注意和主键不同)。
  • 如果是用组合索引创建,则列值的组合必须唯一。
  • 添加唯一键将自动创建唯一索引。

方法一:直接创建唯一索引

create unique index 索引名 on 表名(列名);
create unique index name_index on AAA (name);

方法二:修改表结构方式添加唯一索引

alter table 表名 add unique 索引名 (列名);
alter table AAA add unique index score_index (score);

方法三:创建表时添加唯一索引

create table 表名 (字段1 数据类型,字段2 数据类型,...,unique 索引名 (列名));
create table BBB (id int,name char(10),score char(15),phone char(20),unique index name_index(name));

2.3、创建主键索引

主键索引是一种特殊的唯一索引,不仅确保索引列的数据唯一性,还能标识表中的每一行数据,必须指定为“primary key”。主键的特点包括:

  • 每个表只能有一个主键
  • 主键列不能有NULL值
  • 主键自动创建唯一索引,确保列值的唯一性

方法一:创建表时指定主键索引

create table 表名 (字段1 数据类型,字段2 数据类型,...,primary key (列名));
create table CCC (id int,name char(10),score char(15),phone char(20),primary key(id));

方法二:修改表结构方式添加主键索引

alter table 表名 add primary key (列名); 
mysql> alter table AAA add primary key(id);

注:

  • 如果表中已经有数据,给列添加主键前需要确保该列的所有值都是唯一的,且没有NULL值。
  • 考虑到性能和存储效率,主键通常设置为整型或UUID。
  • 主键的选择对数据库性能有重要影响,应谨慎选择能唯一标识每行数据的列作为主键。

2.4、创建组合索引

组合索引(也称为复合索引或多列索引)是指基于表中两个或多个列创建的索引。组合索引可以提高查询性能,特别是在查询条件涉及多个列时。它按照索引中列的顺序存储数据,这使得数据库能够高效地利用索引来加速查询和排序操作

需要满足最左原则,因为select语句的 where条件是依次从左往右执行的,所以在使用select 语句查询时where条件使用的字段顺序必须和组合索引中的排序一致,否则索引将不会生效。

方法一:创建表时指定组合索引

create table 表名 (列名1 数据类型,列名2 数据类型,列名3 数据类型,……,index 索引名 (列名1,列名2,列名3,……));
create table DDD (id int,name char(10),score char(15),phone char(20),index index_bak(id,name,score));

方法二:修改表结构方式添加组合索引

alter table 表名 add index 索引名 (字段1,字段2,字段3,……);
alter table CCC add index index_bak(name,score,phone);

注:

索引顺序:在定义组合索引时,列的顺序非常重要。应根据查询中最常用的列来安排索引中的列顺序
性能影响:虽然索引可以提高查询性能,但过多的索引会增加插入、更新和删除操作的开销,因为数据库需要维护这些索引。因此,应根据实际需要创建索引
前导列优化:尽可能利用索引的前导列进行查询,以充分利用组合索引的优势。

2.5、创建全文索引

全文索引通过创建文本数据的索引来加速对文本的搜索查询,它会分析文本列中的内容,将文本分解成词元(tokens)或关键词,并建立一个搜索关键词的索引。这样,当进行文本搜索时,数据库可以直接利用这个索引来快速定位包含特定关键词的记录,而不是逐行扫描整个表。

全文索引可以在 CHAR、VARCHAR 或者 TEXT 类型的列上创建。每个表只允许有一个全文索引。

方法一:直接创建全文索引

create fulltext index 索引名 on 表名 (列名);
create fulltext index score_index on BBB (score);

方法二:修改表结构方式添加全文索引

alter table 表名 add fulltext 索引名 (列名);
alter table BBB add fulltext index phone_index (phone);

方法三:创建表时指定全文索引

create table 表名 (字段1 数据类型,字段2 数据类型,……,fulltext 索引名 (列名)); 
create table EEE (id int,name char(10),score char(15),phone char(20),fulltext index name_index (name));

3、删除索引

3.1、直接删除索引

drop index 索引名 on 表名;
drop index name_index on AAA;

3.2、修改表格式方式删除索引

alter table 表名 drop index 索引名;
alter table AAA drop index score_index;

3.3、删除主键索引

alter table 表名 drop primary key;
alter table AAA drop primary key;

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

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

相关文章

Vue3项目开发——新闻发布管理系统(五)

文章目录 七、登录&注册页面设计开发4、后端接口调用4.1 AXIOS请求工具封装4.2 创建 axios 实例①安装 axios② 封装 axios 模块4.3完成 axios 基本配置5 实现 注册功能5.1 创建接口调用js文件5.2 页面中调用注册方法6 实现 登录功能6.1 创建接口调用js文件6.2 页面中调用登…

VirtualBox 中 Ubuntu 系统在桥连模式下网络适配器启动过慢或连接失败

一个(无线或有线)网卡同时为虚拟机和电脑提供网络。 一、技术基础 网络桥接技术: 网卡可以通过桥接模式与虚拟机的网络接口进行连接。在这种模式下,网卡会创建一个虚拟的网桥,将虚拟机的网络接口与物理网络接口&…

基础闯关5

一、XTuner简介 XTuner 是一个高效、灵活、全能的轻量化大模型微调工具库。 高效 支持大语言模型 LLM、多模态图文模型 VLM 的预训练及轻量级微调。XTuner 支持在 8GB 显存下微调 7B 模型,同时也支持多节点跨设备微调更大尺度模型(70B)。自…

视频编码标准化组织介绍

ITU ITU,即International Telecommunication Union,国际电信联盟,是一个专门负责信息通信技术(Information and Communication Technologies,ICT)领域的联合国机构。它成立于1865年,最初是为了协…

彻底改变计算机视觉的 Vision Transformer (ViT) 综合指南(视觉转换器终极指南)

欢迎来到雲闪世界。大家好!对于那些还不认识我的人,我叫 Francois,我是 Meta 的研究科学家。我热衷于解释先进的 AI 概念并使其更容易理解。 今天,让我们深入探讨计算机视觉领域最重要的贡献之一:Vision Transformer&…

Debezium+Kafka:Oracle 11g 数据实时同步至 DolphinDB 运维手册

目前我们已经支持基于开源技术 Debezium Kafka,从 Mysql 和 Oracle 11g 实时同步数据到 DolphinDB 中。由于当前方案涉及到四个程序的部署,而且具体的 Source 同步任务和 Sink 同步任务还需要额外管理,在运维上具有一定难度。 本文将基于 O…

分类预测|基于鲸鱼优化WOA最小二乘支持向量机LSSVM的数据分类预测Matlab程序WOA-LSSVM 多特征输入多类别输出

分类预测|基于鲸鱼优化WOA最小二乘支持向量机LSSVM的数据分类预测Matlab程序WOA-LSSVM 多特征输入多类别输出 文章目录 一、基本原理1. 最小二乘支持向量机(LSSVM)LSSVM的基本步骤: 2. 鲸鱼优化算法(WOA)WOA的基本步骤…

安装 rocky9.4

涉及软件:virtualbox、rocky linux 9.4、mobaxterm virtualbox新建虚拟机,设置虚拟机配置 启动虚拟机,第一次会提示挂载虚拟光盘,选择下载的rocky linux 9.4。 选择第一项,安装rocky linux 9.4 进入安装设置&#…

echarts graphChart关系图简单逻辑实现

ECharts 的 graph 图表类型非常适合用来展示节点之间的关系,比如社交网络分析、系统架构图等。下面是一个简单的关系图功能,用来展示疾病与一些因素的关联关系。 1、数据之间的关系 首先,你需要准备数据来表示节点(nodes&#…

C ++初阶:类和对象(中)

目录 🌞0.前言 🚈1. 类的6个默认成员函数 🚈2. 构造函数 🚝2.1 概念 🚝2.2特性 🚝2.3编译器默认生成的构造函数。 ✈️补充1: ✈️补充2:开空间问题 🚈3. 析构函…

C++相关概念和易错语法(30)(异常、智能指针)

1.异常 在C语言这样的面向过程编程的语言来说,处理错误一般有两种方式:终止程序,如assert;返回错误码,比如打开文件失败,errno就会改变,perror就会打印错误码对应的错误信息 在面向对象的语言…

云原生存储Rook部署Ceph

Rook 是一款云原生存储编排服务工具,Ceph 是一种广泛使用的开源分布式存储方案,通过Rook 可以大大简化 ceph 在 Kubernetes 集群中的部署和维护工作。 Rook 由云原生计算基金会( CNCF )孵化,且于 2020 年 10 月正式进入毕业阶段。Roo…

【python因果推断库3】使用 CausalPy 进行贝叶斯geolift 分析

目录 导入数据 丹麦的销售额是否有地理提升(GeoLift)? 结果 本笔记本介绍如何使用 CausalPy 的贝叶斯{术语}合成控制功能来评估“地理提升”(GeoLift)。我们的假设情景如下: 你是一家在欧洲运营的公司的…

集成电路学习:什么是ISP系统编程

一、ISP:系统编程 ISP(In-System Programming)即系统编程,是一种在系统内部进行的编程方法,主要用于对闪存(FLASH)、EEPROM等非易失性存储器的编程。ISP编程提供了巨大的灵活性,允许…

SaaS用户增长:提升转化率的实践路径

在SaaS(软件即服务)行业这片竞争激烈的蓝海中,企业要实现稳健的用户增长,必须聚焦于优化用户获取与转化策略,以提升用户转化率。用户转化率,作为衡量SaaS产品市场吸引力和用户接纳度的核心指标,…

图文解析保姆级教程: IDEA里面创建SpringBoot工程、SpringBoot项目的运行和测试、实现浏览器返回字符串

文章目录 一、创建SpringBoot工程(需要联网)二、 定义请求处理类三、运行测试 此教程摘选自我的笔记:黑马JavaWeb开发笔记13——Springboot入门(创建、运行&测试项目)、Http协议(请求&响应协议&…

Unity实战案例 2D小游戏HappyGlass(模拟水珠)

本案例素材和教程都来自Siki学院,十分感谢教程中的老师 本文仅作学习笔记分享交流,不作任何商业用途 预制体 在这个小案例中,水可以做成圆形但是带碰撞体,碰撞体比图形小一圈,顺便加上Trail renderer组件 材质 将碰撞…

SVN介绍和使用

一、SVN(Subversion) SVN 是一种版本控制系统,可以用于管理和控制文件的变更。以下是SVN的基本使用步骤: 安装SVN:首先,您需要在计算机上安装SVN客户端。您可以从Subversion官方网站下载安装程序&#xff…

sql-labs61-65关通关攻略

第61关 一:查看数据库 ?id1)) and updatexml(1,concat(1,(select database())),1)-- 二:查看表名 ?id1)) and updatexml(1,concat(1,(select group_concat(table_name) from information_schema.tables where table_schemasecurity)),1)-- 三&#…

MATLAB/Simulink 汽车ABS仿真模型 防抱死刹车 教程 资料 程序 模型 论文 视频

项目概述 防抱死制动系统(ABS)是现代车辆中的一项重要安全技术,它能够在紧急制动时防止车轮锁死,从而提高车辆的稳定性和操控性。本项目旨在使用MATLAB/Simulink建立一个完整的ABS仿真模型,帮助学习者理解ABS的工作原理…