了解了主键索引的底层原理,主键索引其实就是根据主键字段建立相关的数据结构(B+树),此后在使用主键字段作为条件查询时,会直接根据主键查找B+树的叶子结点。除了主键索引外,普通索引和唯一键索引也是如此,只不过普通索引要稍微绕一点,下面会具体介绍。


目录

一、索引分类

1、主键索引

2、普通索引

3、唯一索引

二、创建索引的原则

三、创建索引

1、主键索引(primary key)

2、普通索引(index)

3、唯一索引(unique)

四、查询索引

五、删除索引


一、索引分类

1、主键索引

略。主键索引的概念这里就不再赘述了,本质就是根据主键在B+树上查找叶子结点。

具体介绍参考:Mysql 索引(一)—— 主键索引的底层原理_仲夏夜之梦~的博客-CSDN博客

2、普通索引

使用普通索引的场景:某个字段存在重复数据

主键索引是根据主键字段建立相关数据结构(B+树),而普通索引则是根据某个非主键字段建立对应的数据结构,此后检索时直接根据该非主键字段查找 B+ 树的叶子结点。普通索引属于非聚簇索引,不同存储引擎对应的普通索引的结构会有所不同。

(1) MyISAM

MyISAM 普通索引的创建方式和主键索引是一样的,叶子结点不保存任何数据,只保存数据记录的地址。

(2) InnoDB

InnoDB 普通索引和主键索引不一样,InnoDB 主键索引中叶子结点保存的是数据记录;而 InnoDB 普通索引中叶子结点保存的是主键索引值,后续要使用该主键索引值到主键索引中获取完整记录,这种方式叫回表查询。

3、唯一索引

使用唯一索引的前提条件:某个字段的内容不存在重复数据

(唯一索引使用的数据结构跟主键索引、普通索引是一样的,不同之处在于作为检索条件的字段不存在重复数据

二、创建索引的原则

第一点,查询频繁的字段应该作为索引。因为索引的目的就是提高检索效率,如果某个字段被频繁使用,使用字段作为检索条件时就有必要提高检索效率。

第二点,更新频繁的字段不适合作为索引。索引的高效是以增删改的效率为代价的。

第三点,不作为检索条件的,不适合作为索引。如果该字段都不会作为条件用于检索,只会出现在结果中,那该字段不适合作为索引。

三、创建索引

1、主键索引(primary key)

主键索引的创建:索引字段必须是主键,主键索引的字段类型一般都是 int,创建主键索引的关键字是primary key

(1) 建表时创建

-- 方式一:create table user1(id int primary key, -- 在创建表的时候,直接在字段名后指定 primary keyname varchar(30));-- 方式二:create table user1(id int,name varchar(30),primary key(id)-- 在创建表的最后,指定某列或某几列为主键索引);

(2) 建表后追加

create table user3(id int,name varchar(30));alter table user3 add primary key(id);-- 创建表以后再添加主键

2、普通索引(index)

普通索引的创建:索引字段的数据允许重复。使用的关键字为 index

(1) 建表时创建

create table user(id int primary key,name varchar(20),email varchar(30),index(name) --在表的定义最后,指定某列为索引);

(2) 建表后追加

create table user(id int primary key,name varchar(20),email varchar(30));alter table user add index(name); --创建完表以后指定某列为普通索引

3、唯一索引(unique)

唯一索引的创建:要求检索字段不能存在重复数据。使用的关键字为 unique。唯一索引的创建方式和普通索引完全一样,只需要把 index 关键字替换成 unique 关键字即可。

四、查询索引

查询某个表中的所有索引以及对应的字段

show index from 表名 [\G];

五、删除索引

(1) 删除主键索引

 alter table 表名 drop primary key;

注意:如果该主键已经被设为了自增(auto_increment),则该主键索引无法被删除。

(2) 删除其他索引(普通索引、唯一索引)

drop index 索引字段名 on 表名;