一、降序索引
在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、这个功能主要用于检查索引好坏,可以先把索引设为隐藏,然后查看查询效率,不用真的删除索引。