iis服务器助手广告广告
返回顶部
首页 > 资讯 > 数据库 >详解MySQL 8.0 之不可见索引
  • 317
分享到

详解MySQL 8.0 之不可见索引

MySQL8.0不可见索引MySQL不可见索引MySQL索引 2022-05-27 05:05:44 317人浏览 八月长安
摘要

言 Mysql 8.0 从第一版release 到现在已经走过了4个年头了,8.0版本在功能和代码上做了相当大的改进和重构。和DBA圈子里的朋友交流,大部分还是5.6 ,5.7的版本,少量的走的比较靠前采用了mysq

Mysql 8.0 从第一版release 到现在已经走过了4个年头了,8.0版本在功能和代码上做了相当大的改进和重构。和DBA圈子里的朋友交流,大部分还是5.6 ,5.7的版本,少量的走的比较靠前采用了mysql 8.0。为了紧追数据库发展的步伐,能够尽早享受技术红利,我们准备将Mysql 8.0引入到有赞的数据库体系。

落地之前 我们会对MySQL 8.0的新特性和功能,配置参数,升级方式,兼容性等等做一系列的学习测试。以后陆陆续续会发布文章出来。本文算是MySQL 8.0新特性学习的第一篇吧,聊聊 不可见索引

不可见索引

不可见索引中的不可见是针对优化器而言的,优化器在做执行计划分析的时候(默认情况下)是会忽略设置了不可见属性的索引。

为什么是默认情况下,如果 optimizer_switch设置use_invisible_indexes=ON 是可以继续使用不可见索引。

话不多说,我们先测试几个例子

如何设置不可见索引

我们可以通过带上关键字VISIBLE|INVISIBLE的create table,create index,alter table 设置索引的可见性。


mysql> create table t1 (i int,
   > j int,
   > k int,
   > index i_idx (i) invisible) engine=innodb;
Query OK, 0 rows affected (0.41 sec)

mysql> create index j_idx on t1 (j) invisible;
Query OK, 0 rows affected (0.19 sec)
Records: 0 Duplicates: 0 Warnings: 0

mysql> alter table t1 add index k_idx (k) invisible;
Query OK, 0 rows affected (0.10 sec)
Records: 0 Duplicates: 0 Warnings: 0

mysql> select index_name,is_visible from infORMation_schema.statistics where table_schema='test' and table_name='t1';
+------------+------------+
| INDEX_NAME | IS_VISIBLE |
+------------+------------+
| i_idx   | NO     |
| j_idx   | NO     |
| k_idx   | NO     |
+------------+------------+
3 rows in set (0.01 sec)

mysql> alter table t1 alter index i_idx visible;
Query OK, 0 rows affected (0.06 sec)
Records: 0 Duplicates: 0 Warnings: 0

mysql> select index_name,is_visible from information_schema.statistics where table_schema='test' and table_name='t1';
+------------+------------+
| INDEX_NAME | IS_VISIBLE |
+------------+------------+
| i_idx   | YES    |
| j_idx   | NO     |
| k_idx   | NO     |
+------------+------------+
3 rows in set (0.00 sec)

不可见索引的作用

面对历史遗留的一大堆索引,经过数轮新老交替开发和DBA估计都不敢直接将索引删除,尤其是遇到比如大于100G的大表,直接删除索引会提升数据库的稳定性风险。

有了不可见索引的特性,DBA可以一边设置索引为不可见,一边观察数据库的慢查询记录和thread running 状态。如果数据库长时间没有相关慢查询 ,thread_running比较稳定,就可以下线该索引。反之,则可以迅速将索引设置为可见,恢复业务访问。

Invisible Indexes 是 server 层的特性,和引擎无关,因此所有引擎(InnoDB, TokuDB, MyISAM, etc.)都可以使用。

设置完不可见索引,执行计划无法使用索引


mysql> show create table t2 \G
*************************** 1. row ***************************
    Table: t2
Create Table: CREATE TABLE `t2` (
 `i` int NOT NULL AUTO_INCREMENT,
 `j` int NOT NULL,
 PRIMARY KEY (`i`),
 UNIQUE KEY `j_idx` (`j`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci
1 row in set (0.01 sec)
mysql> insert into t2(j) values(1),(2),(3),(4),(5),(6),(7);
Query OK, 7 rows affected (0.04 sec)
Records: 7 Duplicates: 0 Warnings: 0


mysql> explain select * from t2 where j=3\G
*************************** 1. row ***************************
      id: 1
 select_type: SIMPLE
    table: t2
  partitions: NULL
     type: ALL
possible_keys: NULL
     key: NULL
   key_len: NULL
     ref: NULL
     rows: 7
   filtered: 14.29
    Extra: Using where
1 row in set, 1 warning (0.01 sec)

mysql> alter table t2 alter index j_idx visible;
Query OK, 0 rows affected (0.08 sec)
Records: 0 Duplicates: 0 Warnings: 0

mysql> explain select * from t2 where j=3\G
*************************** 1. row ***************************
      id: 1
 select_type: SIMPLE
    table: t2
  partitions: NULL
     type: const
possible_keys: j_idx
     key: j_idx
   key_len: 4
     ref: const
     rows: 1
   filtered: 100.00
    Extra: Using index
1 row in set, 1 warning (0.01 sec)

使用不可见索引的注意事项

The feature applies to indexes other than primary keys (either explicit or implicit).

不可见索引是针对非主键索引的。主键不能设置为不可见,这里的 主键 包括显式的主键或者隐式主键(不存在主键时,被提升为主键的唯一索引) ,我们可以用下面的例子展示该规则。


mysql> create table t2 (
   >i int not null,
   >j int not null ,
   >unique j_idx (j)
   >) ENGINE = InnoDB;
Query OK, 0 rows affected (0.16 sec)

mysql> select index_name,is_visible from information_schema.statistics where table_schema='test' and table_name='t2';
+------------+------------+
| INDEX_NAME | IS_VISIBLE |
+------------+------------+
| j_idx   | YES    |
+------------+------------+
1 row in set (0.00 sec)

### 没有主键的情况下,唯一键被当做隐式主键,不能设置 不可见。
mysql> alter table t2 alter index j_idx invisible;
ERROR 3522 (HY000): A primary key index cannot be invisible
mysql>
mysql> alter table t2 add primary key (i);
Query OK, 0 rows affected (0.44 sec)
Records: 0 Duplicates: 0 Warnings: 0

mysql> select index_name,is_visible from information_schema.statistics where table_schema='test' and table_name='t2';
+------------+------------+
| INDEX_NAME | IS_VISIBLE |
+------------+------------+
| j_idx   | YES    |
| PRIMARY  | YES    |
+------------+------------+
2 rows in set (0.01 sec)

mysql> alter table t2 alter index j_idx invisible;
Query OK, 0 rows affected (0.04 sec)
Records: 0 Duplicates: 0 Warnings: 0

mysql> select index_name,is_visible from information_schema.statistics where table_schema='test' and table_name='t2';
+------------+------------+
| INDEX_NAME | IS_VISIBLE |
+------------+------------+
| j_idx   | NO     |
| PRIMARY  | YES    |
+------------+------------+
2 rows in set (0.01 sec)

force /ignore index(index_name) 不能访问不可见索引,否则报错。


mysql> select * from t2 force index(j_idx) where j=3;
ERROR 1176 (42000): Key 'j_idx' doesn't exist in table 't2'

设置索引为不可见需要获取MDL,遇到长事务会引发数据库抖动

唯一索引被设置为不可见,不代表索引本身唯一性的约束失效


mysql> select * from t2;
+---+----+
| i | j |
+---+----+
| 1 | 1 |
| 2 | 2 |
| 3 | 3 |
| 4 | 4 |
| 5 | 5 |
| 6 | 6 |
| 7 | 7 |
| 8 | 11 |
+---+----+
8 rows in set (0.00 sec)
mysql> insert into t2(j) values(11);
ERROR 1062 (23000): Duplicate entry '11' for key 't2.j_idx'

小结

其实没啥说的,祝大家用的愉快。

-The End-

以上就是详解MySQL 8.0 之不可见索引的详细内容,更多关于MySQL 8.0 不可见索引的资料请关注自学编程网其它相关文章!

您可能感兴趣的文档:

--结束END--

本文标题: 详解MySQL 8.0 之不可见索引

本文链接: https://www.lsjlt.com/news/9891.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • MySQL数据库之索引详解
    目录一、MySQL索引简介二、MySQL五种类型索引详解(一)普通索引(二)唯一性索引(三)主键索引(四)复合索引(五)全文索引三、MySQL索引使用原则总结今天继续给大家介绍MyS...
    99+
    2024-04-02
  • 【MySQL】MySQL索引详解
    Mysql索引 0.写在前面1.为什么要使用索引2.常见的索引模型3.索引维护4.回表?举例子。 0.写在前面 文章中包含了: 1.什么是索引 2.索引的数据结构,以及各自的使用场景 3.为什么要设置主键自增? 4.基于主键...
    99+
    2023-08-16
    mysql 数据库 面试
  • MySQL——索引详解
    目录 一、为什么要有索引 二、什么是索引? 三、索引的原理 四、MySQL的存储引擎 五、索引的数据结构 六、聚簇和非聚簇索引 七、索引的设计原则 一、为什么要有索引 一般的应用系统,读写比例在10:1左右,而且插入操作和一般的更新操...
    99+
    2023-09-04
    数据库 mysql mysql优化
  • mysql之explain使用详解(分析索引)
    explain显示了mysql如何使用索引来处理select语句以及连接表。可以帮助选择更好的索引和写出更优化的查询语句。 使用方法,在select语句前加上explain就可以了,如: ex...
    99+
    2024-04-02
  • MySQL-索引详解(三)
    ♥️作者:小刘在C站 ♥️个人主页:小刘主页 ♥️每天分享云计算网络运维课堂笔记,努力不一定有回报,但一定会有收获加油!一起努力,共赴美好人生! ♥️树高千尺,落叶归根人生不易,人间真情 目录 5.SQL性能分析 5.2 慢查询...
    99+
    2023-09-02
    数据库 mysql 运维
  • MySQL-索引详解(五)
    ♥️作者:小刘在C站 ♥️个人主页: 小刘主页  ♥️努力不一定有回报,但一定会有收获加油!一起努力,共赴美好人生! ♥️学习两年总结出的运维经验,以及思科模拟器全套网络实验教程。专栏:云计算技术 ♥️小刘私信可以随便...
    99+
    2023-09-04
    数据库 mysql 运维
  • MySQL的索引详解
    一. 索引基础 1.1 简介 在MySQL中,索引(index)也叫做“键(key)”,它是存储引擎用于快速找到记录的一种数据结构。 索引对于良好的性能非常关键,尤其是当表中的数据量越来越大时,索引对性能的...
    99+
    2024-04-02
  • mysql可不可以创建联合索引
    这篇文章主要介绍“mysql可不可以创建联合索引”,在日常操作中,相信很多人在mysql可不可以创建联合索引问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”mysql可不可以创...
    99+
    2024-04-02
  • MySQL-索引详解(四)
    ♥️作者:小刘在C站 ♥️个人主页:小刘主页 ♥️每天分享云计算网络运维课堂笔记,努力不一定有回报,但一定会有收获加油!一起努力,共赴美好人生! ♥️树高千尺,落叶归根人生不易,人间真情 前言 本次MySQL—索引章节比较多,分...
    99+
    2023-09-04
    数据库 mysql 运维
  • 12C如何创建不可见索引自测
    这篇文章将为大家详细讲解有关12C如何创建不可见索引自测,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。 SQL> create tab...
    99+
    2024-04-02
  • Mysql执行原理之索引合并详解
    mysql执行原理之索引合并详解 我们前边说过MySQL在一般情况下执行一个查询时最多只会用到单个二级索引,但存在有特殊情况,在这些特殊情况下也可能在一个查询中使用到多个二级索引,MySQL中这种使用到多个索引来完成一次...
    99+
    2022-12-20
    Mysql索引合并 Mysql执行原理
  • 详解MySQL覆盖索引、索引下推
    目录 1.覆盖索引 1.1.概述 1.2.聚集索引、非聚集索引 1.3.回表查询 1.4.覆盖索引 2.索引下推 1.覆盖索引 1.1.概述 覆盖索引,是为了避免“回表查询”,从而降低查询耗时的一种使用索引的方法,所以要聊覆盖索引首先我...
    99+
    2023-09-10
    数据库 java 开发语言
  • mysql添加索引方法详解(Navicat可视化加索引与sql语句加索引)
    目录使用索引的场景:下面是通过sql语句添加索引的方法:1、普通索引1)、直接创建索引2)、修改表结构的方式添加索引3)、删除索引2、唯一索引1)、创建唯一索引2)、修改表结构3、主键索引4、组合索引5、全文索引1)、创...
    99+
    2024-04-02
  • MySQL之MyISAM存储引擎的非聚簇索引详解
    在InnoDB中索引即数据,也就是聚簇索引的那颗B+树的叶子节点中已经包含了所有完整的用户记录。MyISAM的索引方案虽然也是使用树形结构,但是却将索引和数据分开存储,这种索引也叫非...
    99+
    2024-04-02
  • MySQL 索引失效详解
    MySQL 索引失效详解 一、MySQL索引失效原因汇总 隐式的类型转换,索引失效查询条件包含or,可能导致索引失效like通配符可能导致索引失效查询条件不满足联合索引的最左匹配原则在索引列上使用my...
    99+
    2023-09-08
    mysql 数据库 sql
  • mysql联合索引详解
    比较简单的是单列索引(b+tree)。遇到多条件查询时,不可避免会使用到多列索引。联合索引又叫复合索引。 b+tree结构如下: 每一个磁盘块在mysql中是一个页,页大小是固定的,mysql innodb的默认的页大小是16k,每个索引会...
    99+
    2023-09-02
    mysql 数据库 sql
  • MySQL之索引结构解读
    目录mysql索引是什么二叉树红黑树B+Tree总结MySQL索引是什么 MySQL索引就是帮助MySQL高效获取数据的数据结构。 这个数据结构也就是我们常说的二叉树、红黑树、Hash表等索引数据结构,借助这样的数据结构...
    99+
    2023-04-28
    MySQL索引结构 MySQL索引 索引结构
  • ElasticSearch之索引模板滚动索引实现详解
    目录一. 前言二. 索引三. 索引模板3.1 索引模板的创建3.2 索引模板 Setting3.3 索引映射 :mapping四. 业务功能4.1 创建滚动索引4.2 创建和绑定策略...
    99+
    2023-05-16
    ElasticSearch索引模板滚动索引 ElasticSearch索引
  • Python NumPy教程之索引详解
    目录为什么我们需要 NumPy 使用索引数组进行索引索引类型基本切片和索引高级索引NumPy 或 Numeric Python 是一个用于计算同质 n 维数组的包。在 nu...
    99+
    2024-04-02
  • MySQL之索引(入门级讲解)
    目录 一.索引的概念   1.1索引的简介  1.2.索引的优缺点 二.MySQL索引语法 2.1查看索引 2.2创建索引 2.2.1 创建表时创建索引  2.2.2存在的表上创建索引 2.3删除索引 三.索引的数据结构       3.1...
    99+
    2023-08-31
    mysql 数据库
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作