Mysql 索引(三)—— 不同索引的创建方式(主键索引、普通索引、唯一键索引)
了解了主键索引的底层原理,主键索引其实就是根据主键字段建立相关的数据结构(B+树),此后在使用主键字段作为条件查询时,会直接根据主键查找B+树的叶子结点。除了主键索引外,普通索引和唯一键索引也是如此,只不过普通索引要稍微绕一点,下面会具体介绍。
目录
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 key name 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 表名;
来源地址:https://blog.csdn.net/challenglistic/article/details/129166717
免责声明:
① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。
② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341