不可见索引允许您将索引标记为查询优化器不可用。MySQL维护不可见索引,并在与索引关联的列中的数据发生更改时使其保持最新。

默认情况下,索引是可见的。要使它们不可见,您必须在创建时或使用ALTER TABLE命令显式声明其可见性。MySQL为我们提供了维护索引可见性的关键字VISIBLEINVISIBLE关键字。

要创建不可见索引,请使用以下语句:

 
1
2
CREATE INDEX index_name
ON table_name( c1, c2, ...) INVISIBLE;

在这个语法中:

  1. 首先,在CREATE INDEX子句后指定索引的名称。
  2. 其次,列出要添加到索引的表名和列列表。该INVISIBLE关键字表明您正在创建的索引是不可见的。

例如,以下语句在示例数据库extension中的employees表的列上创建索引,并将其标记为不可见索引:

 
1
2
CREATE INDEX extension
ON employees(extension) INVISIBLE;

要更改现有索引的可见性,请使用以下语句:

 
1
2
ALTER TABLE table_name
ALTER INDEX index_name [VISIBLE | INVISIBLE];

例如,要使extension索引可见,请使用以下语句:

 
1
2
ALTER TABLE employees
ALTER INDEX extension VISIBLE;

您可以通过查询数据库中的statistics表来查找索引及其可见性information_schema

 
1
2
3
4
5
6
7
8
SELECT
    index_name,
    is_visible
FROM
    information_schema.statistics
WHERE
    table_schema = 'classicmodels'
        AND table_name = 'employees';

这是输出:

此外,您可以使用该SHOW INDEXES命令显示表的所有索引:

 
1
SHOW INDEXES FROM employees;

如前所述,查询优化器不使用不可见索引,那么为什么首先使用不可见索引?实际上,隐形索引有许多应用程序。例如,您可以使索引不可见,以查看它是否对性能产生影响,并将索引再次标记为可见。

MySQL隐形索引和主键

主键列上的索引不能是不可见的。如果您尝试这样做,MySQL将发出错误。

此外,隐式主键索引也不可见。当您UNIQUENOT NULL没有主键的表的列上定义索引时,MySQL会隐式地理解该列是主键列,并且不允许您使索引不可见。

请考虑以下示例。

首先,创建一个新表UNIQUE上一个索引NOT NULL列:

 
1
2
3
4
5
6
7
8
CREATE TABLE discounts (
    discount_id INT NOT NULL,
    name VARCHAR(50) NOT NULL,
    valid_from DATE NOT NULL,
    valid_to DATE NOT NULL,
    amount DEC(5 , 2 ) NOT NULL DEFAULT 0,
    UNIQUE discount_id(discount_id)
);

其次,尝试使discount_id 索引不可见:

 
1
2
ALTER TABLE discounts
ALTER INDEX discount_id INVISIBLE;

MySQL发出以下错误消息:

 
1
Error Code: 3522. A primary key index cannot be invisible  

MySQL隐形索引系统变量

为了控制查询优化器使用的可见索引,MySQL使用系统变量的use_invisible_indexes标志optimizer_switch。默认情况下,use_invisible_indexes关闭:

 
1
SELECT @@optimizer_switch;

在本教程中,您了解了MySQL隐形索引,如何创建

MySQL隐形索引简介的更多相关文章

  1. MySQL数据库索引简介

    一.索引的含义和特点     索引是一个单独的.存储在磁盘上的数据库结构,他们包含着对数据表里所有记录的引用指针.使用索引用于快速找出某个或多个列中有一特点值的行,所用MySQL列类型都可以被索引,对 ...

  2. mysql之索引简介

    索引分类 mysql在存储数据时,是按着主键的顺序存储的.主键索引是物理索引,其他索引都是逻辑索引. 普通索引 普通索引是最基本的索引,没有任何限制的索引,普通索引列的数据可以重复.其唯一的任务就是加 ...

  3. 【Mysql】索引简介

    本文口味:番茄炒蛋,预计阅读:10分钟. 博客又停更了两个月,在这期间,对人生和世界多了许多思考.在人生的不同阶段,会对生活和世界有着不一样的认知,而认知的改变也会直接反应在行为模式之中. 对于生活的 ...

  4. 【mysql】- 索引简介篇

    简介 我们都知道mysql使用存储引擎的是InnoDB,InnoDB使用的索引的对应的数据结构是B+树 结构图: 如上图所示,我们实际用户记录是存放在B+树的最底层的节点上,这些节点也被称为叶子节点或 ...

  5. MySQL中的索引简介

    MySQL中的SQL的常见优化策略 MySQL中的索引优化 MySQL中的索引简介 一. 索引的优点 为什么要创建索引?这是因为,创建索引可以大大提高系统的查询性能. 第一.通过创建唯一性索引,可以保 ...

  6. 第 3 章 MySQL 存储引擎简介

    第 3 章 MySQL 存储引擎简介 前言 3.1 MySQL 存储引擎概述 MyISAM 存储引擎是 MySQL 默认的存储引擎,也是目前 MySQL 使用最为广泛的存储引擎之一.他的前身就是我们在 ...

  7. MySQL(3)-索引

    一.索引类型 在MySQL中,存储引擎使用索引,首先在索引中找到对应值,然后根据匹配的索引记录中找到对应的行. 无论是多么复杂的ORM工具,在精妙和复杂的索引面前都是"浮云".这里 ...

  8. 为什么MySQL数据库索引选择使用B+树?

    在进一步分析为什么MySQL数据库索引选择使用B+树之前,我相信很多小伙伴对数据结构中的树还是有些许模糊的,因此我们由浅入深一步步探讨树的演进过程,在一步步引出B树以及为什么MySQL数据库索引选择使 ...

  9. MySQL慢日志简介及Anemometer工具介绍

    作者:王航威 - fordba.com 来源:http://fordba.com/box-anemometer-visual-mysql-slow.html,叶师傅对原文内容略有调整 备注:王航威是知 ...

随机推荐

  1. 修改linux的ssh默认端口号22的方法

    一.修改配置文件 vi /etc/ssh/sshd_config 找到#Port 22 修改为自己要使用的端口号:Port 26000 然后 :x  退出保存 二.重启ssh服务 /etc/init. ...

  2. 【IT笔试面试题整理】二叉搜索树转换为双向链表

    [试题描述] 将二叉搜索树转换为双向链表 对于二叉搜索树,可以将其转换为双向链表,其中,节点的左子树指针在链表中指向前一个节点,右子树指针在链表中指向后一个节点. 思路一: 采用递归思想,对于二叉搜索 ...

  3. SpringBoot 配置热部署

    做个记录,以免忘记: 1. 在 pom.xml 文件中的 dependencies 标签以内添加组件 devtools,具体内容如下: <!-- SpringBoot 热部署组件 devtool ...

  4. Unix/Linux系统管理技术手册学习笔记——shell

    创建日期:2016/02/29 更新日期:2016/02/29 shell变量赋值时不能在等号两边留空白,否则shell会把变量名误认为是命令名 双引号括起来的变量可以进行替换(用*和?这样的文件名匹 ...

  5. Docker实战-为镜像添加SSH服务

    1.基于docker commit命令创建 Docker提供了docker commit命令,支持用户提交自己对定制容器的修改,并生成新的镜像. 命令格式为:docker commit CONTAIN ...

  6. Js的substring和C#的Substring

    Js的substring 语法: 程序代码String.substring(start, end) 说明:返回一个从start开始到end(不包含end)的子字符串. 示例: 程序代码var str= ...

  7. 用Collectors对List去重

    在学习本篇之前,最好对java8新特性有一定的了解.可以参考:Java8新特性--流(Stream) 场景:有一个实体的List集合,需要根据实体中的某个字段对List去重 要想去重,可以考虑使用Tr ...

  8. java文件下载以及中文乱码解决

    在客户端下载文件时替换下载文件的名称,但是当名称是中文时浏览器会出现乱码,解决代码如下: public org.springframework.http.ResponseEntity<Input ...

  9. Go语言封装Http协议GET和POST请求

    本文几乎没有文字叙述: /* 有关Http协议GET和POST请求的封装 */ package net import ( "net/http" "io" &qu ...

  10. Android - fragment Manager

    fragment基本使用: http://www.cnblogs.com/qlky/p/5415679.html Fragmeng优点 Fragment可以使你能够将activity分离成多个可重用的 ...