MySQL8.0中索引的新特性(降序索引、隐藏索引)

一、降序索引

在MySQL8.0后可以指定索引降序排列,这样使用该索引降序查找时,效率更高。

CREATE TABLE user (
	id INT PRIMARY KEY,
	name VARCHAR (100),
	age INT(11) NOT NULL,
	INDEX multi_idx(id,name,age DESC)
);

当按照 age列 降序查询时效率更高,比如:

SELECT * FROM user ORDER BY id, name, age DESC;

二、隐藏索引

在MySQL 5.7版本及之前,只能通过显式的方式删除索引。此时,如果发现删除索引后出现错误,又只能通过显式创建索引的方式将删除的索引创建回来。如果数据表中的数据量非常大,或者数据表本身比较大,这种操作就会消耗系统过多的资源,操作成本非常高。

从MySQL 8.x开始支持隐藏索引(invisible indexes),只需要将待删除的索引设置为隐藏索引,使查询优化器不再使用这个索引(即使使用force index(强制使用索引),优化器也不会使用该索引), 确认将索引设置为隐藏索引后系统不受任何响应,就可以彻底删除索引。 这种通过先将索引设置为隐藏索引,再删除索引的方式就是软删除

1、建表时创建隐藏索引

CREATE TABLE user (
	id INT PRIMARY KEY,
	name VARCHAR (100),
	age INT (11) NOT NULL,
	info VARCHAR (100),
	INDEX idx_info (info) INVISIBLE
);

 2、在已经存在的表上创建

(1)使用ALTER TABLE语句创建

ALTER TABLE user ADD INDEX idx_age(age) INVISIBLE;

(2)使用CREATE INDEX创建

CREATE INDEX idx_name ON user(name) INVISIBLE;

3、切换索引的可见状态

ALTER TABLE user ALTER INDEX idx_age VISIBLE;    #切换为可见
ALTER TABLE user ALTER INDEX idx_age INVISIBLE;  #切换为不可见

4、小结

1、当一个索引被设为隐藏索引时,查询优化器将不再使用这个索引。例如:

EXPLAIN SELECT * FROM user WHERE info = 'abc';

 如上面的创建语句所示,这是 info 字段为隐藏索引,这时使用 info 作为条件查询时,不会使用索引。

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

3、这个功能主要用于检查索引好坏,可以先把索引设为隐藏,然后查看查询效率,不用真的删除索引。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值