MySQL学习(9)——索引

索引

介绍

总之,加了索引可以加快查询时间。

主键默认创建索引。

分类

根据数据结构分类:Harsh索引、B+Tree索引

根据功能分类:单列索引(包括:普通索引、唯一索引、主键索引)、组合索引、全文索引、空间索引

Harsh索引就是索引字段根据一种计算方法f(x)得到相应的值,如a->f(a)->A,之后你想找a,还按照这个计算方法得到A就可以直接找到目标。没有索引之前,就是从表格的开头一个一个比对。

B+Tree索引就是把一堆数据分块,在哪个区间就在这个区间找。比如要找图中的006,从根003 005 开始,左边是小于003的,中间是大于等003并小于005的,右边是大于等于005的,所以我们直接到第二层的最右边找,再到第三层的最右边找。最后一层才有每个数据所在位置的索引。

单列索引

单列索引:一个索引只包含单个列,但一个表中可以有多个单列索引;

普通索引

普通索引:MySQL中基本索引类型,没有什么限制,允许在定义索引的列中插入重复值和空值,纯粹为了查询数据更快一点。

创建索引:

1、创建表的时候直接创建

sql 复制代码
create table 表名(
  列名1 数据类型,
  列名2 数据类型,
  ...,
  -- 创建索引
  index 索引名(要加索引的列名)
);

2、表外创建

sql 复制代码
create index 索引名 on 表名(加索引的列名);

3、修改表结构添加索引

sql 复制代码
alter table 表名 add index 索引名(要加索引的列名);

查看索引:

1、查看数据库中的所有索引。(前面的是固定的,查的时候复制改一下数据库名就好了)

sql 复制代码
select * from mysgl.'innodb_index_stats' a where a.'database_name'='数据库名';

2、查看表中所有索引,方法1。

sql 复制代码
select * from mysgl.'innodb_index_stats' a where a. 'database_name' = '数据
库名' and a.table_name like '%表名%';

3、查看表中所有索引.方法2。

sql 复制代码
show index from 表名;

三种方法显示的效果不太一样。

删除索引:

方式1:

sql 复制代码
index 索引名 on 表名;

方式2:

sql 复制代码
alter table 表名 drop index 索引名;

唯一索引

唯一索引与前面的普通索引类似,不同的就是:索引列的值必须唯一,但允许有空值。如果是组合索引,列值的组合必须唯一。它有以下几种创建方式:

1、创建表的时候直接创建

sql 复制代码
create table 表名(
  列名1 数据类型,
  列名2 数据类型,
  ...,
  -- 创建索引
  unique index 索引名(要加索引的列名)
);

2、表外创建

sql 复制代码
create unique index 索引名 on 表名(加索引的列名);

3、修改表结构添加索引

sql 复制代码
alter table 表名 add unique index 索引名(要加索引的列名);

删除方法和上面相同。

主键索引

每张表一般都会有自己的主键,当我们在创建表时,MySQL会自动在主键列上建立一个索引,这就是主键索引。主键是具有唯一性并且不允许为NULL,所以他是一种特殊的唯一索引。

组合索引

组合索引也叫复合索引,指的是我们在建立索引的时候使用多个字段,例如同时使用身份证和手机号建立索引,同样的可以建立为普通索引或者是唯一索引。

复合索引的使用复合最左原则。

组合普通索引:

sql 复制代码
create index 索引名 on 表名(列名l (length),列名2 (length));

组合唯一索引:

sql 复制代码
create unique index 索引名 on 表名(列名l (length),列名2 (length));

全文索引

(不常用)

  • 全文索引的关键字是fulltext
  • 全文索引主要用来查找文本中的关键字,而不是直接与索引中的值相比较,它更像是一个搜索引擎,基于相似度的查询,而不是简单的where语句的参数匹配。
  • 用like+%就可以实现模糊匹配了,为什么还要全文索引?like+%在文本比较少时是合适的,但是对于大量的文本数据检索,是不可想象的。全文索引在大量的数据面前,能比like+%快N倍,速度不是一个数量级,但是全文索引可能存在精度问题。


空间索引

  • MySQL在5.7之后的版本支持了空间索引,而且支持OpenGIS几何数据模型
  • 空间索引是对空间数据类型的字段建立的索引,MYSQL中的空间数据类型有4种,分别是GEOMETRY、POINT、LINESTRING、 POLYGON.
  • MYSQL使用SPATIAL关键字进行扩展,使得能够用于创建正规索引类型的语法创建空间索引。
  • 创建空间索引的列,必须将其声明为NOT NULL。
  • 空间索引一般是用的比较少,了解即可。

索引优化

避免索引失效应用------全值匹配

创建组合索引:

sql 复制代码
create index idx_n_s_a on tb_table(name,status,address);

此时在进行查找,如果把组合索引的每一列都给用上是效果最好的。

如果全都用上,不需要考虑它们的顺序。

如果不全用,要按从左到右的顺序用上,不然索引会失效。(复合最左原则)

1、索引要从最左边开始匹配,范围查询右边的列,不能使用索引

例如:select * from tb_table where name = 'lining' and status > '5' and address = '北京'; 此时最后的address索引就会失效,只有前面两个组合索引。

2、在索引列上进行运算操作, 索引会失效(status是char类型)

例如:select * from tb_table where substring (name,3,2)='科技' ; 此时索引失效。

3、字符串不加单引号,造成索引失效

例如:select * from tb_table where name = 'lining' and status > 4 ; 此时只有name索引有效。

相关推荐
请你喝好果汁6412 小时前
生信学习笔记:ArchR 处理小麦单细胞 ATAC-seq 中的细胞数差异与 Embedding 报错调试
学习
jinanwuhuaguo2 小时前
OpenClaw、飞书、Claude Code、Codex:四维AI生态体系的深度解构与颗粒化对比分析
大数据·人工智能·学习·飞书·openclaw
萨文 摩尔杰3 小时前
GPS原理学习
学习·fpga开发
fengci.3 小时前
ctfshow(web入门)295-300
java·开发语言·学习
renhongxia15 小时前
多模态融合驱动下的具身学习机制研究
运维·学习·机器人·自动化·知识图谱
今儿敲了吗5 小时前
46| FBI树
数据结构·c++·笔记·学习·算法
疯狂成瘾者5 小时前
git学习目录
git·学习
jinanwuhuaguo6 小时前
AI工具终极解构:OpenClaw、Coze、Dify、FastGPT、n8n、LangChain、RagFlow、GPTBots.ai 的万言深度剖析
人工智能·学习·重构·新人首发·openclaw
observe1017 小时前
51单片机学习
嵌入式硬件·学习·51单片机