
6.3 MySQL 8中索引新特性
MySQL 8开始支持隐藏索引和降序索引。隐藏索引提供了更人性化的数据库操作,降序索引则提高了数据库的性能。
6.3.1 隐藏索引
隐藏索引,顾名思义,不可见索引,不会被优化器使用。默认情况下索引是可见的。隐藏索引可以用来测试索引的性能。验证索引的必要性时不需要删除索引,可以先将索引隐藏,如果优化器性能无影响就可以真正地删除索引。
1. 创建表时直接创建
在MySQL中创建隐藏索引通过SQL语句INVISIBLE来实现,其语法形式如下:
CREATE TABLE tablename( propname1 type1[CONSTRAINT1], propname2 type2[CONSTRAINT2], …… propnamen typen, INDEX [indexname](propname1 [(length)]) INVISIBLE );
上述语句比普通索引多了一个关键字INVISIBLE,用来标记索引为不可见索引。
【示例6-5】在数据库school中,在表t_class的cname字段创建隐藏索引,具体步骤如下:
(1)在创建班级表t_class时,在字段cname上创建隐藏索引,具体SQL语句如下,执行结果如图6-12所示。
CREATE TABLE t_class( classno INT(4), cname VARCHAR(20), loc VARCHAR(40), INDEX index_cname(cname) INVISIBLE);
(2)为了检验班级表t_class中多列索引是否创建成功,执行SQL语句SHOW CREATE TABLE,具体SQL语句如下,执行结果如图6-13所示。
SHOW CREATE TABLE t_class \G

图6-12 创建表t_class

图6-13 查看班级表信息
2. 在已经存在的表上创建
在MySQL创建隐藏索引,除了可以在创建表时实现外,还可以为已经存在的表设置隐藏索引,其语法形式如下:
CREATE INDEX indexname ON tablename(propname[(length)]) INVISIBLE;
在示例6-5中,如果表已存在,可通过如下语句创建多列索引:
CREATE INDEX index_cname ON t_class(cname) INVISIBLE;
3. 通过ALTER TABLE语句创建
在MySQL创建隐藏索引,除了可以在创建表时实现外,还可以为已经存在的表设置隐藏索引,其语法形式如下:
ALTER TABLE tablename ADD INDEX indexname (propname [(length)]) INVISIBLE;
在示例6-5中,如果表已存在,可通过如下语句创建多列索引:
ALTER TABLE t_class ADD INDEX index_cname(cname) INVISIBLE;
4. 切换索引可见状态
已存在的索引可通过如下语句切换可见状态:
ALTER TABLE tablename ALTER INDEX index_name INVISIBLE; ALTER TABLE tablename ALTER INDEX index_name VISIBLE;
6.3.2 降序索引
降序索引以降序存储键值。虽然在语法上,从MySQL 4起就支持DESC,但实际上该DESC定义是被忽略的,MySQL在此之前创建的仍然是升序索引,使用时进行反向扫描,这大大降低了数据库的效率。在某些场景下,降序索引意义重大。例如,如果一个查询,需要对多个列进行排序,且顺序要求不一致,那么使用降序索引将会避免数据库使用额外的文件排序操作,从而提高性能。
在MySQL中创建降序索引的SQL语句与创建多列索引的语法相同。
【示例6-6】在t_class表中创建降序索引,实现classno升序排列,cname降序排列。
(1)创建降序索引的SQL语句如下所示,执行结果如图6-14所示。


图6-14 创建表t_class
(2)使用如下语句检查SELECT语句发现没有使用filesort文件排序,而是使用预先创建的索引,如图6-15所示。

图6-15 查看查询语句