返回顶部
首页 > 资讯 > 数据库 >MySQL8.0 索引优化invisible index详情
  • 250
分享到

MySQL8.0 索引优化invisible index详情

2024-04-02 19:04:59 250人浏览 安东尼
摘要

目录前言索引使用情况测试如何临时让优化器可以看到这个索引呢?修改索引的可见性前言 Mysql8.0 开始支持不可见索引。 优化器根本不使用不可见索引,但会以其他的方式正常维护。 默认情况下 索引是可见的。 通过不可见索引

前言

Mysql8.0 开始支持不可见索引。 优化器根本不使用不可见索引,但会以其他的方式正常维护

默认情况下 索引是可见的。 通过不可见索引,可以方便数据库管理人员 检查 索引对查询性能的影响,而不会进行破坏性的更改 。

应用场景: 软删除,灰度发布

-- 创建测试表
mysql> create table t1(i int ,j int);
Query OK, 0 rows affected (0.03 sec)



-- 创建索引 
mysql>
mysql> create index idx_i on t1(i);
Query OK, 0 rows affected (0.02 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> -- 创建 一个隐藏索引
mysql> create index idx_j on t1(j) invisible ;
Query OK, 0 rows affected (0.02 sec)
Records: 0  Duplicates: 0  Warnings: 0



-- 查看索引
mysql> show index from t1\G
*************************** 1. row ***************************
        Table: t1
   Non_unique: 1
     Key_name: idx_i
 Seq_in_index: 1
  Column_name: i
    Collation: A
  Cardinality: 0
     Sub_part: NULL
       Packed: NULL
         Null: YES
   Index_type: BTREE
      Comment:
Index_comment:
      Visible: YES
   Expression: NULL
*************************** 2. row ***************************
        Table: t1
   Non_unique: 1
     Key_name: idx_j
 Seq_in_index: 1
  Column_name: j
    Collation: A
  Cardinality: 0
     Sub_part: NULL
       Packed: NULL
         Null: YES
   Index_type: BTREE
      Comment:
Index_comment:
      Visible: NO
   Expression: NULL
2 rows in set (0.00 sec)

上面 对 i,j 分别创建了索引, 其中j 为不可见索引 ,即默认优化器不会使用到该索引的。

索引使用情况测试

mysql> explain  select * from t1 where i= 10\G
*************************** 1. row ***************************
           id: 1
  select_type: SIMPLE
        table: t1
   partitions: NULL
         type: ref
possible_keys: idx_i
          key: idx_i
      key_len: 5
          ref: const
         rows: 1
     filtered: 100.00
        Extra: NULL
1 row in set, 1 warning (0.00 sec)

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

如何临时让优化器可以看到这个索引呢?

mysql> select @@optimizer_switch\G
*************************** 1. row ***************************
@@optimizer_switch: index_merge=on,index_merge_uNIOn=on,index_merge_sort_union=on,index_merge_intersection=on,engine_condition_pushdown=on,index_condition_pushdown=on,mrr=on,mrr_cost_based=on,block_nested_loop=on,BATched_key_Access=off,materialization=on,semijoin=on,loosescan=on,firstmatch=on,duplicateweedout=on,subquery_materialization_cost_based=on,use_index_extensions=on,condition_fanout_filter=on,derived_merge=on,use_invisible_indexes=off,skip_scan=on
1 row in set (0.00 sec)

-- 设置开关
mysql> set session optimizer_switch='use_invisible_indexes=on';
Query OK, 0 rows affected (0.00 sec)
mysql> select @@optimizer_switch\G
*************************** 1. row ***************************
@@optimizer_switch: index_merge=on,index_merge_union=on,index_merge_sort_union=on,index_merge_intersection=on,engine_condition_pushdown=on,index_condition_pushdown=on,mrr=on,mrr_cost_based=on,block_nested_loop=on,batched_key_access=off,materialization=on,semijoin=on,loosescan=on,firstmatch=on,duplicateweedout=on,subquery_materialization_cost_based=on,use_index_extensions=on,condition_fanout_filter=on,derived_merge=on,use_invisible_indexes=on,skip_scan=on
1 row in set (0.00 sec)

-- 此时可以看到 优化器已经可以看到这个索引啦
mysql> explain  select * from t1 where j= 10\G
*************************** 1. row ***************************
           id: 1
  select_type: SIMPLE
        table: t1
   partitions: NULL
         type: ref
possible_keys: idx_j
          key: idx_j
      key_len: 5
          ref: const
         rows: 1
     filtered: 100.00
        Extra: NULL
1 row in set, 1 warning (0.00 sec)

修改索引的可见性

mysql> ALTER TABLE t1 ALTER INDEX idx_j INVISIBLE;
Query OK, 0 rows affected (0.01 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> ALTER TABLE t1 ALTER INDEX idx_j  VISIBLE;
Query OK, 0 rows affected (0.02 sec)
Records: 0  Duplicates: 0  Warnings: 0

注意: 主键索引 是不能设置 不可见的 。

create  table t2(`id` int not null auto_increment, primary key (`id`));


mysql> show index from t2\G
*************************** 1. row ***************************
        Table: t2
   Non_unique: 0
     Key_name: PRIMARY
 Seq_in_index: 1
  Column_name: id
    Collation: A
  Cardinality: 0
     Sub_part: NULL
       Packed: NULL
         Null:
   Index_type: BTREE
      Comment:
Index_comment:
      Visible: YES
   Expression: NULL
1 row in set (0.01 sec)

mysql> alter table t2 alter index PRIMARY key(`id`) invisible;
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL Server version for the right syntax to use near 'PRIMARY invisible' at line 1

测试 添加 主键 为不可见索引:

mysql> create  table t3(id int not null);
Query OK, 0 rows affected (0.03 sec)

mysql> alter table t3 add primary key pk_t3(id)  invisible;
ERROR 3522 (HY000): A primary key index cannot be invisible

primary key 是必须可见的, 不能设置为不可见索引。

在生产环境中 也可以利用隐藏索引进行 SQL 语句的性能测试,或者对索引进行逻辑删除,索引的灰度发布测试,以及软删除索引等。

到此这篇关于MySQL8.0 索引优化invisible index详情的文章就介绍到这了,更多相关MySQL索引优化内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

您可能感兴趣的文档:

--结束END--

本文标题: MySQL8.0 索引优化invisible index详情

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

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

猜你喜欢
  • MySQL8.0 索引优化invisible index详情
    目录前言索引使用情况测试如何临时让优化器可以看到这个索引呢?修改索引的可见性前言 mysql8.0 开始支持不可见索引。 优化器根本不使用不可见索引,但会以其他的方式正常维护。 默认情况下 索引是可见的。 通过不可见索引...
    99+
    2024-04-02
  • MySQL8.0 索引优化invisible index详情
    目录前言索引使用情况测试如何临时让优化器可以看到这个索引呢?修改索引的可见性前言 MySQL8.0 开始支持不可见索引。 优化器根本不使用不可见索引,但会以其他的方式正常维护。 默认...
    99+
    2024-04-02
  • mysql 索引使用及优化详情
    目录前言mysql索引原理mysql索引分类索引创建语法1、创建索引2、查看索引3、删除索引4、为 username和password创建联合索引5、给user表添加一个info的字段,并为这个字段添加全文索引已经存在的...
    99+
    2022-07-18
    mysql 索引使用优化 mysql 索引优化
  • mysql 索引使用及优化详情
    目录前言mysql索引原理mysql索引分类索引创建语法1、创建索引2、查看索引3、删除索引4、为 username和password创建联合索引5、给user表添加一个info的字...
    99+
    2024-04-02
  • MySQL SQL优化 - 覆盖索引(covering index)
    CREATE TABLE `user_group` (   `id` int(11) NOT NULL auto_increment,   `uid` int(11) NOT NULL,...
    99+
    2024-04-02
  • MySQL索引优化之适合构建索引的几种情况详解
    目录结论建立索引的场景小结结论 在where后面的过滤字段上建立索引(select/update/delete后面的where都是适用的),使用索引加快过滤效率,不用进行全表扫描在具有唯一要...
    99+
    2022-07-29
    MySQL 索引优化 MySQL 索引构建
  • MySQL索引优化之不适合构建索引及索引失效的几种情况详解
    目录结论不建议建立索引的场景索引失效的场景小结结论 具体案例下文有详尽描述 不适合建立索引的场景: 数据量比较小的表不建议建立索引有大量重复数据的字段上不建议建立索引(类似:性别字段)需要进行频繁更新的表不建议建立索引w...
    99+
    2022-07-29
    MySQL 索引优化 MySQL 不适合构建索引的场景
  • SQL索引(索引优化)
    #1.最左前缀匹配原则,非常重要的原则, create index ix_name_email on s1(name,email,) - 最左前缀匹配:必须按照从左到右的顺序匹配 select * from s1 wher ...
    99+
    2021-11-01
    SQL索引(索引优化)
  • MySQL索引优化Explain详解
    在日常工作中,我们会有时会开慢查询去记录一些执行时间比较久的SQL语句,找出这些SQL语句并不意味着完事了,些时我们常常用到explain这个命令来查看一个这些SQL语句的执行计划,查看该SQL语句有没有使用上了索引...
    99+
    2022-05-12
    MySQL索引优化 MySQL Explain
  • MySQL中的索引index(超详细)
    概念: 在MySQL中,索引(index)是一种特殊的数据结构,它能够加快数据库中数据的检索速度。索引可以看做是一本书的目录,它提供了一种快速查找数据的方式。 MySQL中的索引是建立在一张表的一列或多列上的,用于加快对表中数据的查找速度...
    99+
    2023-09-02
    mysql 数据库
  • MySQL基础(六)-索引(index)详解
    目录 一、什么是索引? 二、索引的实现原理 三、在MySQL中,主键、unique字段上会自动添加索引。 四、索引的创建与删除 创建索引: 删除索引: 五、查看SQL语句是否使用了索引 六、索引的失效 失效的第一种情况:模糊匹配当中以“%”...
    99+
    2023-09-01
    sql 数据库
  • MySQL索引优化
    一、单表 创建索引之前:type=ALL全表扫描,Extra里面的Using filesort(文件内部排序) 根据where后面的条件创建:CREATE INDEX idx_article_ccv ON articl...
    99+
    2019-01-06
    MySQL索引优化
  • oracle 优化--索引
    一、事务1、简介事务是数据处理的核心,是业务上的一个逻辑单元,它能够保证其中对数据所有的操作,要么全部成功,要么全部失败。DBMS通过事务的管理来协调用户的并发行为,减少用户访问资源的冲突。 1)...
    99+
    2024-04-02
  • mysql织梦索引优化之MySQL Order By索引优化
    在一些情况下,MySQL可以直接使用索引来满足一个ORDER BY 或GROUP BY 子句而无需做额外的排序。尽管ORDER BY 不是和索引的顺序准确匹配,索引还是可以被用到,只要不用的索引部分和所有的额外的ORDER B...
    99+
    2024-04-02
  • Explain详解与索引优化实践
    为什么要用explain 使用EXPLAIN关键字可以模拟优化器执行SQL语句,从而知道MySQL是如何处理你的SQL语句的。分析你的查询语句或是结构的性能瓶颈 如何使用explain 下面是使用 explain 的例子: 在 s...
    99+
    2014-11-15
    Explain详解与索引优化实践
  • MySQL索引优化EXPLAIN
    日常在CURD的过程中,都避免不了跟数据库打交道,大多数业务都离不开数据库表的设计和SQL的编写,那如何让你编写的SQL语句性能更优呢? 先来整体看下MySQL逻辑架构图: MySQL整体逻辑架构图可以分为Server和存储引擎层。...
    99+
    2015-10-24
    MySQL索引优化EXPLAIN
  • MySQL优化(3):索引
    MySQL优化中,最重要的优化手段就是索引,也是最常用的优化手段   索引简介: 索引:关键字与数据位置之间的映射关系 关键字:从数据中提取,用于标识,检索数据的特定内容 目的:加快检索   索引检索为什么快: (1)关键字相对于...
    99+
    2014-05-17
    MySQL优化(3):索引
  • MySQL优化之索引
    SQL为什么需要优化? 对于初学者来说,能够写出实现功能的SQL语句而不出错,查询出所需要的结果,就已经能够满足日常使用了。但在某些场景,对性能的要求比较高,因此,要求SQL的执行响应速度快,就需要对SQL进行一定程度的优化。 在...
    99+
    2021-02-14
    MySQL优化之索引
  • mysql优化和索引
    表的优化1.定长与变长分离    如 int,char(4),time核心且常用字段,建成定长,放在一张表;    而varchar,text,blob这种...
    99+
    2024-04-02
  • centos7-mysql-索引优化
    索引优化,优化查询速度-------------------------------------------------------count,统计一个表总计行数myisam储存引擎有自带计数器,使用cou...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作