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索引有效。

相关推荐
点心的游戏开发世界31 分钟前
Unity C# 脚本学习笔记:命名空间与 using
学习·unity·c#
香芋芋圆2 小时前
AI 冲击内卷之下,普通前端如何破局?WebGIS—— 低门槛突围赛道
前端·javascript·人工智能·学习·职场发展
点心的游戏开发世界2 小时前
Unity C# 脚本学习笔记:泛型
学习·unity·c#
tju新生代魔迷4 小时前
Verilog HDL 学习笔记(十三)| 第13章 编程语言接口(PLI)
笔记·学习
我爱cope6 小时前
【计算机网络 | 网络层11:ICMP 协议:Ping 和 Traceroute 的底层原理】
网络·学习·计算机网络
问天_观心6 小时前
大模型微调学习(一)
开发语言·人工智能·学习·语言模型·github
苏生Susheng7 小时前
【软件实施】Linux系统Shell脚本教程
linux·运维·服务器·chrome·spring boot·学习·实施
我命由我123457 小时前
Photoshop - Photoshop 把两个 PSD 文件合并
学习·ui·职场和发展·产品运营·产品经理·学习方法·photoshop
小雪崩9 小时前
嵌入式学习 day39:TCP并发服务器模型
linux·服务器·c语言·网络·学习·tcp/ip
知识分享小能手9 小时前
深度学习学习教程,从入门到精通,概率与信息论 — 知识点详解(3)
人工智能·深度学习·学习·数据挖掘·概率论