mysql的索引类型以及优缺点

一、索引

索引被用来快速找出在一个列上用一特定值的行。没有索引,MySQL不得不首先以第一条记录开始并然后读完整个表直到它找出相关的行。

数据表越大,花费时间越多。如果表对于查询的列有一个索引,MySQL能快速到达一个位置去搜寻到数据文件的中间,没有必要考虑所有数据。

二、索引分类

sql 复制代码
0、查看索引  show index from 数据库表名

1.普通索引

特点:是最基本的索引,它没有任何限制。

2.唯一索引

特点:与前面的普通索引类似,不同的就是:索引列的值必须唯一,但允许有空值。如果是组合索引,则列值的组合必须唯一。

3.主键索引

特点;是一种特殊的唯一索引,一个表只能有一个主键,不允许有空值。一般是在建表的时候同时创建主键索引

4.组合索引

特点:指多个字段上创建的索引,只有在查询条件中使用了创建索引时的第一个字段,索引才会被使用。使用组合索引时遵循**最左前缀**集合

例如:`ALTER TABLE `table_name` ADD INDEX index_name ( `column1`, `column2`, `column3` )`

这个表结构,每次使用索引的时候必须带上最左侧的索引值'column1',不然将会索引无效。

5.全文索引

从3.23.23版开始支持全文索引和全文检索,FULLTEXT,可以在char、varchar或text类型的列上创建。

参考博客:
MySQL索引类型

三、mysql中的key值和index的区别

1、key

首先要明确,key 是数据库的物理结构,它包含两层意义,一是约束(偏重于约束和规范数据库的结构完整性),二是索引(辅助查询用的)。包括primary key, unique key, foreign key 等。

2、index

index是数据库的物理结构,它只是辅助查询的,它创建时会在另外的表空间(mysql中的innodb表空间)以一个类似目录的结构存储。索引要分类的话,分为前缀索引、全文本索引等;因此,索引只是索引,它不会去约束索引的字段的行为。

3、Key值(PRI, UNI, MUL)

perl 复制代码
PRI主键约束
UNI唯一约束;
MUL可以重复。(就是我们常说的index索引)

4、区别

当我们只是普通的创建索引的时候,此时的key和index是没区别的。当我们创建唯一索引的时候,此时相当于同时使用key的UNI模式限制字段的唯一性,同时给该字段加上索引(index)模式。

所以就很明确了,key和index一直都是相辅相成的。特别是在我们建立索引的时候,我们就需要不同的key来约束索引的字段。

此处参考博客:
mysql中key 、primary key 、unique key 与index区别

四、索引的缺点

sql 复制代码
1.虽然索引大大提高了查询速度,同时却会降低更新表的速度,如对表进行insert、update和delete。因为更新表时,不仅要保存数据,还要保存一下索引文件。

2.建立索引会占用磁盘空间的索引文件。一般情况这个问题不太严重,但如果你在一个大表上创建了多种组合索引,索引文件的会增长很快。

索引只是提高效率的一个因素,如果有大数据量的表,就需要花时间研究建立最优秀的索引,或优化查询语句。

五、如何选择索引

sql 复制代码
1、性能优化过程中,选择在哪个列上创建索引是最重要的步骤之一。可以考虑使用索引的主要有两种类型的列:在where子句中出现的列,在join子句中出现的列。

2、考虑列中值的分布,索引的列的基数越大,索引的效果越好。

3、使用短索引,如果对字符串列进行索引,应该指定一个前缀长度,可节省大量索引空间,提升查询速度。

4、利用最左前缀(一般是指联合索引,也就是组合索引)

5、不要过度索引,只保持所需的索引。每个额外的索引都要占用额外的磁盘空间,并降低写操作的性能。在修改表的内容时,索引必须进行更新,有时可能需要重构,因此,索引越多,所花的时间越长。

6、like语句操作
一般情况下不推荐使用like操作,如果非使用不可,如何使用也是一个问题。like "%aaa%" 不会使用索引而like "aaa%"可以使用索引。

参考链接:
MySQL索引分类和各自用途

mysql博大精深,越学习越深感知识之无限。

end

相关推荐
名字还没想好☜10 小时前
Go context.AfterFunc 实战(Go 1.21):context 一取消就自动跑清理,告别手写 goroutine 监听 Done
后端·golang·go
liyinchi19882 天前
微信小程序支付遇到“由于小程序违规,支付功能暂时无法使用” 解决办法
java·微信小程序·go
天天喝旺仔2 天前
Go 泛型实战:从类型参数、约束到可复用泛型容器与函数
数据结构·算法·容器·go
gospace3 天前
【无标题】
go·gb28181·gowvp
我不会起名字3223 天前
一天一道算法题(35):电话号码的字母组合
java·数据结构·后端·python·leetcode·go·回溯
江湖十年3 天前
Go GOPROXY 兜底链的坑:从一次诡异的 CI lint 失败说起
后端·面试·go
秋风点枝4 天前
gogogo!go语言感悟大观--打卡day01
go·devops
探索云原生4 天前
KubeClipper 1.7.0 发布:Operation 优化与 Kubernetes 1.37 支持
linux·docker·云原生·kubernetes·go
右耳朵猫AI4 天前
Go周刊2026W37 | Ebitengine 纯 Go 化、simd 重写 TurboPFor、json/v2 落地
后端·微服务·go
福兮说4 天前
Gin 项目里的错误处理:让 Controller 不必知道错误是怎么来的
后端·go·gin·架构设计