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

相关推荐
小杨互联网5 小时前
Go 现代 CLI 工具离线镜像合集
开发语言·后端·golang·开源·go·命令行
hourinX8 小时前
从直接填格子到筛选图案:头像生成这部分是怎样改过来的—— gdenticon 重构日志(三)
go
我不会起名字32210 小时前
Redis 从 0 到 1(十三):分布式锁被误删、锁不住?Go 无 Lua 实现 3 级防御
redis·go·分布式锁·watch·setnx
hourinX1 天前
从 v1 到 v2,我重新拆了头像生成的整条链路—— gdenticon 重构日志(二)
go
FungLeo1 天前
成为全栈·Go 后端篇·分类树与标签关系:目录变更为何需要协调
golang·go·gorm·数据库事务·分类树·成为全栈
FungLeo1 天前
成为全栈·Go 后端篇·文章查询与展示投影:安全分页、排序和软删除
golang·go·gorm·分页查询·成为全栈·sql安全
KevinAshen672 天前
用 Go 修复旧下载工具:从接口 403 到凭证截断的完整复盘
go·github
FungLeo3 天前
成为全栈·Go 后端篇·跨语言认证兼容:Node 与 Go 如何互认 JWT 和密码
golang·go·jwt·身份认证·成为全栈·bcrypt
FungLeo3 天前
成为全栈·Go 后端篇·重写之前先锁基线:契约、Node 版本与行为清单
golang·node.js·go·openapi·契约测试·成为全栈
小满zs4 天前
Go语言第十七章(反射)
后端·go