MySQL索引的创建、删除以及MySQL8.0索引新特性:支持降序索引、隐藏索引

1.索引的分类

  • 功能逻辑上说,索引主要有4种,分别是普通索引、唯一索引、主键索引、全文索引。
  • 按照物理实现方式,索引可以分为2种:聚簇索引和非聚簇索引。
  • 按照作用字段个数进行划分,分成单列索引和联合索引。

1.1 普通索引

在创建普通索引时,不附加任何限制条件,只是用于提高查询效率。这类索引可以创建在任何数据类型中,其值是否唯一和非空,要由字段本身的完整性约束条件决定。建立索引以后,可以通过索引进行查询。例如,在表student的字段name上建立一个普通索引,查询记录时就可以根据该索引进行查询。

1.2 唯一性索引

使用UNIQUE参数可以设置索引为唯一性索引,在创建唯一性索引时,限制该索引的值必须是唯一的,但允许空值。在一张数据表里可以有多个唯一索引。

1.3 主键索引

主键索引就是一种特殊的唯一性索引,在唯一索引的基础上增加了不为空的约束,也就是NOT NULL+UNIQUE,一张表里最多只有一个主键索引。

1.4 单列索引

在表中的单个字段上创建索引。单列索引只根据该字段进行索引。单列索引可以是普通索引,也可以是唯一性索引,还可以是全文索引。只要保证该索引只对应一个字段即可。一个表可以有多个单列索引。

1.5 多列索引

多列索引是在表的多个字段组合上创建一个索引。该索引指向创建时对应的多个字段,可以通过这几个字段进行查询,但是只有查询条件中使用了这些字段中的第一个字段时才会被使用。例如,在表中的字段id、name和gender上建立一个多列索引idx_id_name_gender,只有在查询条件中使用了字段id时该索引才会被使用。使用组合索引时遵循最左前缀集合。

1.6 全文索引

全文索引(也称全文检索)是目前搜索引擎使用的一种关键技术。它能够利用【分词技术】等多种算法智能分析出文本文字中关键词的频率和重要性,然后按照一定的算法规则智能地筛选出我们想要的搜索结果。全文索引非常适合大型数据集,对于小的数据集,它的用处比较小。

1.7 空间索引

使用参数SPATIAL可以设置索引为空间索引。空间索引只能建立在空间数据类型上,这样可以提高系统获取空间数据的效率。MySQL中的空间数据类型包括GEOMETRY、POINT、LINESTRING和POLYGON等。目前只有MyISAM存储引擎支持空间检索,而且索引的字段不能为空值。对于初学者来说,这类索引很少会用到。

2.索引的声明与使用

2.1 创建索引

在声明有主键约束、唯一性约束、外键约束的字段上,会自动添加相关索引

2.1.1 创建表时创建索引


#创建表时创建索引
#语法
create table table_name [col_name data_type]
[UNIQUE | FULLTEXT |SPATIAL] [INDEX | KEY] [index_name](col_name[length][ASC | DESC])

#例:创建普通索引
CREATE TABLE book (
	book_id INT,
	book_name VARCHAR ( 100 ),
	AUTHORS VARCHAR ( 100 ),
	info VARCHAR ( 100 ),
	COMMENT VARCHAR ( 100 ),
	year_publication YEAR,
	#声明索引
	INDEX idx_bname ( book_name ) 
);
#通过命令查看索引
#方式一
SHOW CREATE TABLE book;
#方式二
SHOW INDEX FROM book;
#性能分析工具
EXPLAIN SELECT * FROM book WHERE book_name = 'mqsql';


#例:创建唯一索引
CREATE TABLE book1 (
	book_id INT,
	book_name VARCHAR ( 100 ),
	AUTHORS VARCHAR ( 100 ),
	info VARCHAR ( 100 ),
	COMMENT VARCHAR ( 100 ),
	year_publication YEAR,
	#声明索引
	UNIQUE INDEX idx_bname ( book_name ) 
);
#通过命令查看索引
SHOW INDEX FROM book1;


#例:主键索引:通过定义主键约束的方式定义主键索引
CREATE TABLE book2 (
	book_id INT PRIMARY KEY,
	book_name VARCHAR ( 100 ),
	AUTHORS VARCHAR ( 100 ),
	info VARCHAR ( 100 ),
	COMMENT VARCHAR ( 100 ),
	year_publication YEAR
);
#通过删除主键约束的方式删除主键索引
ALTER TABLE book2 DROP PRIMARY KEY;


#例:单列索引
CREATE TABLE book3 (
	book_id INT,
	book_name VARCHAR ( 100 ),
	AUTHORS VARCHAR ( 100 ),
	info VARCHAR ( 100 ),
	COMMENT VARCHAR ( 100 ),
	year_publication YEAR,
	INDEX idx_bname ( book_name ),
	INDEX idx_bid ( book_id ) 
);


#例:联合索引
CREATE TABLE book4 (
	book_id INT,
	book_name VARCHAR ( 100 ),
	AUTHORS VARCHAR ( 100 ),
	info VARCHAR ( 100 ),
	COMMENT VARCHAR ( 100 ),
	year_publication YEAR,
	INDEX idx_bname_bid ( book_name, book_id ) 
);
SHOW INDEX FROM book4;

2.1.2 创建表时创建索引

#例:联合索引
CREATE TABLE book5 (
	book_id INT,
	book_name VARCHAR ( 100 ),
	AUTHORS VARCHAR ( 100 ),
	info VARCHAR ( 100 ),
	COMMENT VARCHAR ( 100 ),
	year_publication YEAR
);
#方式一
ALTER TABLE book5 ADD INDEX idx_cmt ( COMMENT );
#方式二
CREATE INDEX idx_cbname ON book5 ( book_name );
#通过命令查看索引
SHOW INDEX FROM book5;

2.1.3 参数含义

  • UNIQUEFULLTEXTSPATIAL为可选参数,分别表示唯一索引、全文索引和空间索引
  • INDEXKEY为同义词,两者的作用相同,用来指定创建索引;
  • index_name指定索引的名称,为可选参数,如果不指定,那么MysQL默认col_name为索引名;
  • col_name为需要创建索引的字段列,该列必须从数据表中定义的多个列中选择;
  • length为可选参数,表示索引的长度,只有字符串类型的字段才能指定索引长度;
  • ASCDESC指定升序或者降序的索引值存储。

2.2 删除索引

#方式一
ALTER TABLE book5 DROP INDEX idx_cbname;
#方式二
DROP INDEX idx_bname_bid ON book4;

#删除联合索引中的相关字段
ALTER TABLE book4 DROP COLUMN book_name;

3.MySQL8.0索引新特性

3.1 支持降序索引

CREATE TABLE test (
	a INT,
	b INT,
INDEX idx_a_b ( a ASC, b DESC ));
SHOW CREATE TABLE test;

在这里插入图片描述

3.2 隐藏索引

3.2.1 隐藏索引的作用

从MySQL8.x开始支持隐藏索引(invisible indexes),只需要将删除的索引设置为隐藏索引,使查询优化器不再使用这个索引(即使使用force index(强制使用索引),优化器也不会使用该索引),确认将索引设置为隐藏索引后系统不受任何响应,就可以彻底删除索引。这种通过先将索引设置为隐藏索引,再删除索引的方式就是软删除。
同时,如果你想验证某个索引删除之后的查询性能影响,就可以暂时先隐藏该索引。

3.2.1 隐藏索引的创建

3.2.1.1 创建表时创建隐藏索引
#创建表时创建隐藏索引
CREATE TABLE book6 (
	book_id INT,
	book_name VARCHAR ( 100 ),
	AUTHORS VARCHAR ( 100 ),
	info VARCHAR ( 100 ),
	COMMENT VARCHAR ( 100 ),
	year_publication YEAR,
	#创建不可见的索引
	INDEX idx_cmt(COMMENT) invisible
);
#查看索引
SHOW INDEX FROM book6;
#因为不可见,所以不能用该索引
EXPLAIN SELECT * FROM book6 WHERE COMMENT = 'mysql';**
3.2.1.1 创建表后创建隐藏索引
#创建表后创建隐藏索引
CREATE TABLE book7 (
	book_id INT,
	book_name VARCHAR ( 100 ),
	AUTHORS VARCHAR ( 100 ),
	info VARCHAR ( 100 ),
	COMMENT VARCHAR ( 100 ),
	year_publication YEAR
);
#方式一
ALTER TABLE book7 ADD UNIQUE INDEX uk_idx_bname(book_name) invisible;
#方式二
CREATE INDEX idx_bid  ON book7 ( book_id )invisible;
#查看索引
SHOW INDEX FROM book7;
#因为不可见,所以不能用该索引
EXPLAIN SELECT * FROM book7 WHERE book_name = 'mysql';

3.2.2 修改索引的可见性

#修改索引的可见性
#修改为可见
ALTER TABLE book7 ALTER INDEX uk_idx_bname visible;
#修改为不可见
ALTER TABLE book7 ALTER INDEX uk_idx_bname invisible;

3.2.3 注意

当索引被隐藏时,它的内容仍然是和正常索引一样实时更新的。如果一个索引需要长期被隐藏,那么可以将其删除,因为索引的存在会影响插入、更新和删除的性能。

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值