MYSQL--索引

2023-09-18 22:23:03

目录

一、索引的概念:

二、索引的作用:

三、索引的缺点:

四、创建索引的原则依据:

五、索引的分类和创建:

  1.普通索引:

  2.唯一索引:

  3.主键索引:

  4.组合索引:

  5.全文索引:

六、查看删除索引:

  1.查看索引:

  2.删除索引:


一、索引的概念:

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

二、索引的作用:

  • 设置了合适的索引之后,数据库利用各种快速定位技术,能够大大加快查询速度,这是创建索引的最主要的原因。
  • 当表很大或查询涉及到多个表时,使用索引可以成千上万倍地提高查询速度。
  • 可以降低数据库的IO成本,并且索引还可以降低数据库的排序成本。
  • 通过创建唯一性索引,可以保证数据表中每一行数据的唯一性。
  • 可以加快表与表之间的连接。
  • 在使用分组和排序时,可大大减少分组和排序的时间。
  • 建立索引在搜索和恢复数据库中的数据时能显著提高性能

三、索引的缺点:

  • 索引需要占用额外的磁盘空间。
  • 更新一个包含索引的表需要比更新一个没有索引的表花费更多的时间,这是由于索引本身也需要更新。

    因此,理想的做法是仅仅在常常被搜索的列(以及表)上面创建索引。

对于 MyISAM 引擎而言,索引文件和数据文件是分离的,索引文件用于保存数据记录的地址。
而 InnoDB 引擎的表数据文件本身就是索引文件。

四、创建索引的原则依据:

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

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

五、索引的分类和创建:

  1.普通索引:

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

1.直接创建索引
CREATE INDEX 索引名 ON 表名 (列名[(length)]);
#(列名(length)):length是可选项,下同。如果忽略 length 的值,则使用整个列的值作为索引。
#索引名建议以“_index”结尾。

create index name_index on member (name);

2.修改表方式创建
ALTER TABLE 表名 ADD INDEX 索引名 (列名);

3.创建表的时候指定索引
CREATE TABLE 表名 ( 字段1 数据类型,字段2 数据类型[,...],INDEX 索引名 (列名));

  2.唯一索引:

  与普通索引类似,但区别是唯一索引列的每个值都唯一。

  唯一索引允许有空值(注意和主键不同)。

  如果是用组合索引创建,则列值的组合必须唯一。

  添加唯一键将自动创建唯一索引。

1.直接创建唯一索引:
CREATE UNIQUE INDEX 索引名 ON 表名(列名);
  示例:
create unique index cardid_index on member(cardid);

2.修改表方式创建
ALTER TABLE 表名 ADD UNIQUE 索引名 (列名);

3.创建表的时候指定
CREATE TABLE 表名 (字段1 数据类型,字段2 数据类型[,...],UNIQUE 索引名 (列名));

  3.主键索引:

  是一种特殊的唯一索引,必须指定为“PRIMARY KEY”。一个表只能有一个主键,不允许有空值。 添加主键将自动创建主键索引。

1.创建表的时候指定
CREATE TABLE 表名 ([...],PRIMARY KEY (列名));

2.修改表方式创建
ALTER TABLE 表名 ADD PRIMARY KEY (列名); 
  示例:
alter table member add primary key (id);

  4.组合索引:

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

1.创建表时指定:
CREATE TABLE 表名 (列名1 数据类型,列名2 数据类型,列名3 数据类型,INDEX 索引名 (列名1,列名2,列名3));

2.查询示例:
select * from 表名 where 列名1='...' AND 列名2='...' AND 列名3='...';

  5.全文索引:

  适合在进行模糊查询的时候使用,可用于在一篇文章中检索文本信息。在 MySQL5.6 版本以前
FULLTEXT 索引仅可用于 MyISAM 引擎,在 5.6 版本之后 innodb 引擎也支持 FULLTEXT 索引。全文索引可以在 CHAR、VARCHAR 或者 TEXT 类型的列上创建。

1.直接创建索引:
CREATE FULLTEXT INDEX 索引名 ON 表名 (列名);

2.修改表方式创建:
ALTER TABLE 表名 ADD FULLTEXT 索引名 (列名);

alter table member add fulltext remark_index (remark);

3.创建表的时候指定索引:
CREATE TABLE 表名 (字段1 数据类型[,...],FULLTEXT 索引名 (列名));
#数据类型可以为 CHAR、VARCHAR 或者 TEXT

4.使用全文索引查询:
SELECT * FROM 表名 WHERE MATCH(列名) AGAINST('查询内容');

六、查看删除索引:

  1.查看索引:


 show index from 表名;      #能查看索引的字段和细节,建议以纵向形式查看
 show index from 表名\G     #建议使用\G以纵向形式查看
 
 show keys from 表名;
 show keys from 表名\G
 
 show create table 表名;    #只能查看索引的字段和名称

  2.删除索引:

●直接删除索引
DROP INDEX 索引名 ON 表名;

●修改表方式删除索引
ALTER TABLE 表名 DROP INDEX 索引名;

●删除主键索引
ALTER TABLE 表名 DROP PRIMARY KEY;

更多推荐

使用Jaeger进行分布式跟踪:学习如何在服务网格中使用Jaeger来监控和分析请求的跟踪信息

🌷🍁博主猫头虎带您GotoNewWorld.✨🍁🦄博客首页——猫头虎的博客🎐🐳《面试题大全专栏》文章图文并茂🦕生动形象🦖简单易学!欢迎大家来踩踩~🌺🌊《IDEA开发秘籍专栏》学会IDEA常用操作,工作效率翻倍~💐🌊《100天精通Golang(基础入门篇)》学会Golang语言,畅玩云原生,走遍大

FL Studio21中文免费版编曲制作软件

我们都知道,FLStudio是一款非常好用的音乐编曲软件。随着商业音乐的兴起,编曲这一词汇逐渐被大家所熟知,而有些小伙伴可能也听说过编曲是由四大件进行编写的,所以今天就和大家分享一下,编曲中的四大件是什么,学编曲要先学什么。大家常听到的音乐编曲制作软件大多是Cubase、Nuendo、ProTools、SONAR等等,

【深度学习】实验12 使用PyTorch训练模型

文章目录使用PyTorch训练模型1.线性回归类2.创建数据集3.训练模型4.测试模型附:系列文章使用PyTorch训练模型PyTorch是一个基于Python的科学计算库,它是一个开源的机器学习框架,由Facebook公司于2016年开源。它提供了构建动态计算图的功能,可以更自然地使用Python语言编写深度神经网络

数据结构与算法(六)--链表的遍历,查询和修改,删除操作

一、前言上篇文章我们了解了链表的概念以及链表底层的搭建以及向链表中添加元素的操作。本次我们继续学习链表剩余的操作:遍历,查询和修改、删除操作。二、链表查询以及遍历①获得链表的第index(0-based)个位置的元素(不常用,仅做练习)和add不一样的是,add我们是要找到第Index的前一个元素,所以,我们起点从du

MyBatis 动态 SQL、MyBatis 标签、MyBatis关联查询

MyBatis动态SQL、MyBatis标签、MyBatis关联查询1、MyBatis动态sql的特性2、MyBatis标签2.1、if标签:条件判断2.2、where+if标签2.3、set标签2.4、choose(when,otherwise)语句2.5、trim2.6、MyBatisforeach标签3、整合案例

Linux内核源码分析 (B.8)深度解析 slab 内存池回收内存以及销毁全流程

Linux内核源码分析(B.8)深度解析slab内存池回收内存以及销毁全流程文章目录Linux内核源码分析(B.8)深度解析slab内存池回收内存以及销毁全流程1\.内存释放之前的校验工作2\.slabcache在快速路径下回收内存3\.slabcache在慢速路径下回收内存3.1直接释放对象回slab,调整slab相

在AOSP中根据设备特性进行个性化定制:利用getPackageManager().hasSystemFeature()接口实现

在AOSP中根据设备特性进行个性化定制:利用getPackageManager().hasSystemFeature()接口实现前言AOSP原生框架是Android开放源代码项目的一部分,它不仅支持普通手机设备,还需要针对一些特殊设备(如汽车和手表等)提供定制化的功能。由于这些特殊设备的行为方式与手机系统不完全一致,因

SpringMVC之自定义注解

目录一.JAVA注解简介1.1.Java注解分类1.2.JDK元注解二.自定义注解1.1.如何自定义注解1.2.自定义注解的基本案例1.2.1.案例一(获取类与方法上的注解值)1.2.2.案例二(获取类属性上的注解属性值)1.2.3.案例三(获取参数修饰注解对应的属性值)三.Aop自定义注解的应用好啦,今天的分享就到这

vivado乘法器IP核进行无符号与有符号数相乘问题的验证

本文验证乘法器IP核Multiplier进行无符号(unsigned)与有符号数(signed)相乘的正确性,其中也遇到了一些问题,做此记录。配套工程:https://download.csdn.net/download/weixin_48412658/88354179文章目录问题的讨论验证过程IP核配置例化乘法器仿真

MySQL迁移到达梦数据库实战(使用达梦的DTS迁移工具)

1.mysql源库授权grantselecton*.*todm_read@'%'identifiedby'password';flushprivileges;2.设置数据类型映射设置varchar按字符存储,char也改成varcharchar,(选择强制为字符存储为是,意思是mysql定义的varchar(n)或者c

Simple Factory 简单工厂模式简介与 C# 示例【创建型3.1】【设计模式来了_3.1】

〇、简介1、什么是简单工厂模式?一句话解释:客户类和工厂类严格分工,客户类只需知道怎么用,处理逻辑交给工厂类。简单工厂模式(SimpleFactoryPattern)是日常开发中常用的设计模式。其是一种简单的创建型模式,它通过一个工厂类来创建对象,客户端只需要知道如何使用工厂类,而不需要知道对象的实现细节。工厂类负责创

热文推荐