全部产品
Search
文档中心

云原生数据库 PolarDB:INVISIBLE INDEX

更新时间:Sep 08, 2023

本文档介绍了如何使用INVISIBLE INDEX功能。

背景信息

PolarDB-X支持把index的可见性设置为VISIBLE/INVISIBLE。如果一个index的可见性为INVISIBLE,优化器将不使用该索引。

在大表上创建/删除索引是一个耗时的操作,但修改索引的可见性却很快。因此您可以在不真正删除一个索引的情况下,通过把该索引的可见性设置成INVISIBLE来评估删除索引对您的业务查询性能的影响。

前提条件

PolarDB-X实例版本需在5.4.17-16835173及以上。查看实例版本的方法请参见查看和升级实例版本

注意事项

  • INVISIBLE INDEX功能同时支持AUTO模式数据库与DRDS模式数据库

  • INVISIBLE INDEX仅支持全局二级索引,不支持Local Index。

  • 修改索引的可见性不会影响索引的维护。无论可见性设置为INVISIBLE还是VISIBLE,索引数据都会随着主表数据的更新而更新。如果该索引具有唯一性约束,可见性的设置也不会影响它的唯一性约束。

  • 当一个索引的状态为INVISIBLE时,对其使用force index是无效的。

示例

说明

为方便表述,以下示例的建表语法采用AUTO模式数据库的语法。

  • 不指定VISIBLE/INVISIBLE关键字,直接建表,index的可见性默认为VISIBLE。

    create table t_order (
      `id` bigint(11),
      `order_id` varchar(20),
      `buyer_id` varchar(20),
      global index `g_order_id` (order_id) partition by key(order_id)
    ) partition by hash(`id`);
  • 建表时指定index的可见性。

    create table t_order (
      `id` bigint(11),
      `order_id` varchar(20),
      `buyer_id` varchar(20),
      global index `g_order_id` (order_id) partition by key(order_id) invisible
    ) partition by hash(`id`);
  • 在已经建好的表上添加index,并指定该index的可见性(如不指定VISIBLE/INVISIBLE则默认可见)。

    alter table t_order add global index g_buyer_id(buyer_id) partition by hash(buyer_id) invisible;
  • 修改已经建立的index的可见性。

    -- 改为invisible状态
    alter table t_order alter index `g_order_id` invisible;
    -- 改为visible状态
    alter table t_order alter index `g_order_id` visible;

常见问题

  • Q:把一个index的可见性设置为INVISIBLE后,该检查哪些方面,从而评估删除这个index对业务的影响?

    A:您可以从包括但不限于以下这些方面进行检查:

    • 在业务负载不变的情况下,观察PolarDB-X实例的CPU、内存等指标是否有较大变化;

    • 是否出现预期以外的慢SQL;

    • 如果您正在压测,可以观察压测结果是否有较大变化;

    • 如果您曾在查询语句中用force index显式指定过此index,您可以观察这些查询语句是否变慢。

  • Q:把索引改为INVISIBLE状态,会影响用到该索引的所有SQL。如何查看某条特定的SQL不使用该索引时的效果?

    A:这种情况下您无需使用invisible index,可以通过ignore index来提示优化器在查询时忽略该index。