玩转MySQL8.0新特性(二)优化器索引

  1. 隐藏索引
    隐藏索引不会被优化器使用,但仍然需要进行维护。
    应用场景:软删除、灰度发布。

    1)创建隐藏索引

create index index_name on table_name(cloumn_name) invisible;

2)设置优化器是否使用隐藏索引

set session optimizer_switch="user_invisible_indexes=on";

3)让隐藏索引变的可见

alter table tablename alter index indexname visible;

注意:主键不能设置为隐藏索引

  1. 降序索引

MySQL在语法上很早就已经支持降序索引,但实际上创建的仍然是升序索引,MySQL8.0开始真正支持降序索引。

  • 只有innodb引擎支持降序索引,只支持BTREE降序索引
  • MySQL8.0不再对group by操作进行隐式排序,如果需要排序使用order by

    # MySQL 5.7
    mysql> create table t1(c1 int,c2 int,index idx_c1_c2(c1,c2 desc));
    Query OK, 0 rows affected (0.03 sec)
    mysql> show create table t1\G;
    *************************** 1. row ***************************
           Table: t1
    Create Table: CREATE TABLE `t1` (
      `c1` int(11) DEFAULT NULL,
      `c2` int(11) DEFAULT NULL,
      KEY `idx_c1_c2` (`c1`,`c2`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4
    1 row in set (0.00 sec)
    
    # MySQL 8.0
    mysql> create table t1(c1 int,c2 int,index idx_c1_c2(c1,c2 desc));
    Query OK, 0 rows affected (0.06 sec)
    mysql> show create table t1\G;
    *************************** 1. row ***************************
           Table: t1
    Create Table: CREATE TABLE `t1` (
      `c1` int(11) DEFAULT NULL,
      `c2` int(11) DEFAULT NULL,
      KEY `idx_c1_c2` (`c1`,`c2` DESC)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci ROW_FORMAT=DYNAMIC
    1 row in set (0.00 sec)

3.函数索引

MySQL8.0.13开始支持在索引中使用函数(表达式)的值
支持降序索引,支持json数据的索引
函数表达式基于虚拟列功能实现

1)创建函数索引

create index fun_idx on t3( (UPPER(c2)) );

#json
create table emp(data json, index((CASE(data->>'$.name' as char(30)) )));

explain select * from emp where CASE(data->>'$.name' as char(30)) = 'abc';
0 人推荐

声明:本文原创发布于加藤非博客,转载请注明出处:加藤非博客 jiatengfei.com 。如有侵权,请联系本站删除。

加藤非博客
请先登录再发表评论
  • 最新评论

  • 总共0条评论