本文档介绍了如何使用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。