MySQL 隐形索引

简介:在本教程中,您将了解MySQL隐形索引和管理索引可见性的语句。

MySQL隐形索引简介

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

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

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

CREATE INDEX index_name

ON table_name( c1, c2, ...) INVISIBLE;

在这个语法中:

首先,在CREATE INDEX子句后指定索引的名称。

其次,列出要添加到索引的表名和列列表。INVISIBLE关键字表明您正在创建的索引是不可见的。

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

CREATE INDEX extension

ON employees(extension) INVISIBLE;

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

ALTER TABLE table_name

ALTER INDEX index_name [VISIBLE | INVISIBLE];

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

ALTER TABLE employees

ALTER INDEX extension VISIBLE;

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

SELECT

index_name,

is_visible

FROM

information_schema.statistics

WHERE

table_schema = 'mysqldemo'

AND table_name = 'employees';

这是输出:

+------------+------------+

| INDEX_NAME | IS_VISIBLE |

+------------+------------+

| extension | YES |

| officeCode | YES |

| PRIMARY | YES |

| reportsTo | YES |

+------------+------------+

4 rows in set (0.11 sec)

此外,您可以使用

SHOW INDEXES FROM employees;

+-----------+------------+------------+--------------+----------------+-----------+-------------+----------+--------+------+------------+---------+---------------+---------+------------+

| Table | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | Index_comment | Visible | Expression |

+-----------+------------+------------+--------------+----------------+-----------+-------------+----------+--------+------+------------+---------+---------------+---------+------------+

| employees | 0 | PRIMARY | 1 | employeeNumber | A | 23 | NULL | NULL | | BTREE | | | YES | NULL |

| employees | 1 | reportsTo | 1 | reportsTo | A | 7 | NULL | NULL | YES | BTREE | | | YES | NULL |

| employees | 1 | officeCode | 1 | officeCode | A | 7 | NULL | NULL | | BTREE | | | YES | NULL |

| employees | 1 | extension | 1 | extension | A | 20 | NULL | NULL | | BTREE | | | YES | NULL |

+-----------+------------+------------+--------------+----------------+-----------+-------------+----------+--------+------+------------+---------+---------------+---------+------------+

4 rows in set (0.07 sec)

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

MySQL隐形索引和主键

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

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

请考虑以下示例。

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

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 索引不可见:

ALTER TABLE discounts

ALTER INDEX discount_id INVISIBLE;

MySQL发出以下错误消息:

ERROR 3522 (HY000): A primary key index cannot be invisible

MySQL隐形索引系统变量

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

SELECT @@optimizer_switch;

在本教程中,您了解了MySQL隐形索引,如何创建不可见索引以及如何更改现有索引的可见性。

mysql字段值后面有隐形字符_MySQL 隐形索引相关推荐

  1. MySQL字段值如何区分大小写

    MySQL字段值如何区分大小写 注意:设置的是字段值区分大小写 1. 查询时指定大小写敏感,加关键字'BINARY' (1)删表,建表,新增数据 drop table binary_test; CRE ...

  2. PHP中 如何将二位数组按某一个或多个字段值(升序/降序)排序?数字索引被重置,关联索引保持不变...

    如何将二位数组按某一个或多个字段值(升序/降序)排序?数字索引被重置,关联索引保持不变 1.$arr=array( 2. array('id'=>1,'name'=>'will','age ...

  3. mysql中值换行显示为乱码_MySQL数据移植中的乱码问题

    mysql移植含有中文的数据时,很容易出现乱码问题.很多是在从mysql4.x向mysql5.x移植的时候出现.mysql的缺省字符集是latin1,在使用mysql4.x的时候,很多人都是用的lat ...

  4. mysql 字段值1_2_3 如何查询3是否存在?_MySQL根据col1中的值是否存在于col2中以及col3是否=值来更新col4...

    我有一个表(命名单位),结构如下:id type type_id name parent hide ================================================== ...

  5. mysql字段值不能修改_mysql修改字段属性不起作用

    之前遇到一个bug,后来发现了原因,现在来纪录下吧,省的以后忘了. bug:在数据库中定义了一个字段,类型为decimal(8,2) (PS:decimal(M,D)M数值的总位数. 通俗点讲,就是看 ...

  6. mysql字段为空 不作为查询条件_Mysql基本语法知识点小结

    1.初识MySQL 1.1什么是数据库? 概念:长期存放在计算机内,有组织,可共享的大量数据的集合,是一个数据 "仓库" 作用:保存并且能安全管理数据(增删改查) 数据库分为: 关 ...

  7. mysql 字段值不同枚举_【mysql】关于枚举值 '1','0'的神奇判断

    背景与探索 最近在做一个简单的用户信息的查询及展示,其中在对用户性别判断的时候,出现了一个神奇的情况,首先数据库里有个表存储了性别字段 sex ,字段类型是:enum('0','1') DEFAULT ...

  8. mysql字段超长会报错吗_MySQL使用过程中的报错处理(持续更新)

    MySQL使用过程中的报错处理(持续更新) 一.数据库初始化 1.Percona的MySQL 5.6.20版本数据库初始化 初始化命令(MySQL 5.6版本不适用mysqld命令进行初始化) ./s ...

  9. PostgreSql、MySql字段值为空时取其他值语句

    PostgreSql: COALESCE(expr1,expr2) COALESCE函数是返回参数中的第一个非null的值,它要求参数中至少有一个是非null的,如果参数都是null会报错. sele ...

最新文章

  1. 查看mysql主外键信息
  2. word break
  3. Go案例说明defer panic recover
  4. 将Java程序作成exe文件的几种方法【转载】
  5. FOR JENNIFER MORRISON
  6. Vue.js 极简小例:表单 (输入框 input、文本域 textarea、单选框 radio、下拉菜单 selected、复选框 checkbox)
  7. Java 设计模式之Mediator调节者模式
  8. java jdbc 详解_JDBC详解
  9. LeetCode 914. 卡牌分组
  10. Scala和Java二种方式实战Spark Streaming开发
  11. 【系统架构】缓存Memcache 使用原子性操作add,实现并发锁
  12. 【EI 快速检索 | 九月特邀】经济与计算机多主题国际会议
  13. 微电子电路——例题总结
  14. C# 操作Word文本框——插入图片、表格、文字、超链接等
  15. Spring boot 搭建个人博客系统(六)——文章点击量和阅读排行榜
  16. 分布式系统----时钟同步
  17. 如何使用轻快PDF阅读器编辑PDF文件
  18. java鼠标左键点击四溅,重生之我是一只鼠
  19. android手机没电怎么恢复电量,Android手机电池电量剩下通知
  20. Android webview和HTML的JS交互

热门文章

  1. 如何在多线程中调用winform窗体控件2——实例篇
  2. Windows Phone开发者注册秘籍
  3. glusterfs初步实践一(类似NFS)
  4. 验证apk签名方式(V1 || V2)
  5. makefile使用.lds链接脚本以及 $@ ,$^, $, 解析
  6. 用thinkphp进行微信开发的整体设计思考
  7. 前端培训_backbone
  8. 【原创】MySQL 以及 Python 实现排名窗口函数
  9. RHEL6的系统开机的过程
  10. 多分辨率适配—字体大小适配 sp与dp区别