这些Mysql索引底层知识你是必须知道的

想进大厂,这些Mysql索引底层知识你是必须知道的

Java数据全能者
大鱼号

08-11
你可能还想关注
查看更多[娱乐]
领域优质大鱼号

前言

这一篇是讲解Mysql中做使用到的「索引的种类」,「索引正确使用的原则」、「怎么优化索引」、「以及两种存储引擎InnoDB和MyISAM索引的数据布局原理」。

索引种类

在说索引之前,我们先来说一说什么是索引呢?对于索引个人的理解就是,索引是一种加快查询数据的数据结构。

所以,索引就是一种数据结构,作用就是发挥这种数据结构的作用,加快查询的效率,例如:InnoDB存储引擎中使用的是就是B+tree这种数据结构来组织索引。

Mysql中索引的种类也不是很多,不同类型的索引有不同的作用,索引的作用相互之间也存在交叉关系,Mysql中索引主要分为以下几类:

「主键索引」(PRIMARY KEY):主键索引一般都是在创建表的时候指定,「一个表只有一个主键索引」,特点是「唯一、非空」。

「唯一索引」(UNIQUE):唯一索引具有的特点就是唯一性,可以在创建表的时候指定,也可以在创建表后创建。

「普通索引」(INDEX):普通索引唯一的作用就是加快查询。

「组合索引」( INDEX):组合索引是创建一个「多个字段的索引」,这个概念是相对于上上面的单列索引而言,组合索引查询遵循「最左前缀原则」。

「全文索引」(FULLTEXT):全文索引是针对一些大的「文本字段」创建的索引,也称为「全文检索」。

「聚簇索引」和「非聚簇索引」:聚簇索引和非聚簇索引的概念比上面的概念要大,属于包含和被包含的关系。例如:InnoDB中主键索引使用的就是聚簇索引。

若是你想查看一个表的所有索引,可以执行下面的sql来查看:

show index from 表名

例如,查看我自己的测试表里面的索引,如下图所示,Key_name表示索引的名字,Column_name表示索引的字段。

打开UC浏览器 查看更多精彩图片

上面大概的说了主要索引的概念,下面详细的介绍一下这几大索引的特点和使用。

主键索引

主键索引在InnoDB存储引擎中是最常见的索引类型,一个表都会有一个主键索引,它索引的字段不允许为空值,并且唯一。

一般是在创建表的时候,可以通过RIMARY KEY指定主键索引,在InnoDB存储引擎中,若是创建表的时候没有主观创建主键索引,Mysql就会看表中是否有唯一索引,有,就会指定「非空的唯一索引」为主键索引;

没有,就会默认生成一个6byte空间的自动增长主键作为主键索引,可以通过select _rowid from 表名查询的是对应的主键值.。

MyISAM储存引擎是可以不存在主键索引,MyISAM和InnoDB储存数据的结构方式还是有明显的区别,这个后面篇章会详细讲解。

唯一索引

唯一索引与主键索引的区别就是,唯一索引允许为空,若是在组合索引中,只要创建的列值是唯一的

唯一索引在实际中更多的是用来保证数据的唯一性,假如你仅仅要数据能够快速查询,你也可以使用普通索引,所以唯一索引重在体现它的唯一性。

实际的业务场景,有些库表字段要求唯一,就可以使用唯一索引,创建唯一索引的方式有三种。

(1)一个是在创建表的时候指定,如下sql:

CREATE TABLE user( id INT PRIMARY KEY NOT NULL, name VARCHAR(16) NOT NULL, UNIQUE unique_name (name(10)) );

(2)也可以在表创建后创建,如下sql:

CREATE UNIQUE INDEX unique_name ON user(name(10));

(3)通过修改表结构创建,如下sql:

ALTER user ADD UNIQUE unique_name ON (name(10))

这里有一个细节要注意的是创建的name字段,指定的长度是16字符,而创建的索引的长度制定的是10字符,因为也没有人的名字长度会超过10个字符,所以减少索引长度,能够减少索引所占的空间的大小。

普通索引

普通索引的唯一作用就是加快数据的查询,一般对查询语句WHERE和ORDER BY后面的字段创建普通索引。

创建普通索引的方式也有三种,基本和创建唯一索引的方式一样,只是把关键字UNIQUE换成INDEX,如下所示:

// 创建表的时候创建CREATE TABLE user( id INT PRIMARY KEY NOT NULL, name VARCHAR(16) NOT NULL, INDEX index_name (name(10)) );// 创建表后创建CREATE INDEX INDEX index_name ON user(name(10));// 修改表结构创建ALTER user ADD INDEX index_name ON (name(10))

若是想删除索引,可以通过执行下面的sql进行删除索引:

DROP INDEX index_name ON user;

组合索引

组合索引即用多个字段创建一个索引,组合索引能够避免「回表查询」,相对于多字段的单列索引,组合索引的查询效率更高。

创建组合索引(联合索引)的方式和上面创建普通索引的方式一样,只不过字段的数目多了,如下sql创建:

// 其它方式和上面的一样,这里就只列举修改表结构的方式创建ALTER TABLE employee ADD INDEX name_age_sex (name(10),age,sex);

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值