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

相关推荐
架构师那点事儿4 小时前
golang 用unsafe 无所畏惧,但使用不得到会panic
架构·go·掘金技术征文
于顾而言21 小时前
【笔记】Go Coding In Go Way
后端·go
qq_1728055921 小时前
GIN 反向代理功能
后端·golang·go
follycat1 天前
2024强网杯Proxy
网络·学习·网络安全·go
OT.Ter1 天前
【力扣打卡系列】单调栈
算法·leetcode·职场和发展·go·单调栈
探索云原生1 天前
GPU 环境搭建指南:如何在裸机、Docker、K8s 等环境中使用 GPU
ai·云原生·kubernetes·go·gpu
OT.Ter1 天前
【力扣打卡系列】移动零(双指针)
算法·leetcode·职场和发展·go
码财小子2 天前
k8s 集群中 Golang pprof 工具的使用
后端·kubernetes·go
明月看潮生5 天前
青少年编程与数学 02-003 Go语言网络编程 04课题、TCP/IP协议
青少年编程·go·网络编程·编程与数学
明月看潮生6 天前
青少年编程与数学 02-003 Go语言网络编程 03课题、网络编程协议
青少年编程·go·网络编程·编程与数学