如何查询 OceanBase MySQL 索引是本地还是全局?

nico 7 阅读 OceanBase

适用版本:OceanBase V4.x(MySQL 模式)

在 OceanBase 的 MySQL 模式中,索引分为本地索引(Local Index) 和全局索引(Global Index) 两种类型。本地索引的分区规则与主表完全一致,每个索引分区只映射对应主表分区的数据,所有基于本地索引的查询基本都是本地执行,性能极高。全局索引则拥有独立的分区规则,不再与主表分区保持一对一关系,一个索引键可能映射到多个主表分区的数据。

MySQL 模式默认创建的是本地索引。了解索引的实际类型对于 SQL 性能诊断和架构优化至关重要。下面介绍两种实用的查询方法。

方法一:通过系统租户查询 __all_virtual_table(推荐)

适用场景:需要批量查看某个库或某张表下所有索引的 local/global 属性。

在 sys 租户下执行以下 SQL:

SELECT db.database_name,
       d.table_name  AS data_table_name,
       SUBSTR(i.table_name, LENGTH(CONCAT('__idx_', i.data_table_id, '_')) + 1) AS index_name,
       i.index_type,
       CASE WHEN i.index_type IN (1,2) THEN 'local'
            WHEN i.index_type IN (3,4) THEN 'global'
            ELSE CONCAT('other:', i.index_type) END AS locality
FROM oceanbase.__all_virtual_table i
JOIN oceanbase.__all_virtual_table d
  ON i.tenant_id = d.tenant_id
 AND i.data_table_id = d.table_id
JOIN oceanbase.__all_virtual_database db
  ON d.tenant_id = db.tenant_id
 AND d.database_id = db.database_id
WHERE i.table_type = 5                         -- 只取索引表
  AND i.tenant_id = 1001                       -- 指定租户 ID
  AND db.database_name = 'test_db'     -- 指定库
  AND d.table_name = 'test_table'        -- 指定表,去掉则查整库
ORDER BY d.table_name, locality, index_name;

关键说明:

  • table_type = 5 表示只筛选索引表。在 __all_virtual_table 中,table_type 的定义为:0-系统表、1-系统视图、2-虚拟表、3-用户表、4-用户视图、5-索引表、6-临时表等。

  • index_type 字段直接标识索引类型:1 = 本地普通索引,2 = 本地唯一索引,3 = 全局普通索引,4 = 全局唯一索引,5 = 主键,7/8 为全局本地存储索引。

  • 索引表名格式为 __idx_{主表table_id}_{索引名},通过 SUBSTR 还原出原始索引名称。

提示:将 WHERE 条件中的 d.table_name 去掉,即可查询整个库下所有表的索引类型分布,适合做索引架构的批量体检。

方法二:业务租户下通过 SHOW CREATE TABLE 查看

适用场景:快速查看单张表的索引定义,无需切换到 sys 租户。

在 业务租户下执行:

-- 1. 先查看当前会话的兼容模式设置
SHOW VARIABLES LIKE '_show_ddl_in_compat_mode';

-- 2. 关闭 MySQL 兼容模式,以显示 OceanBase 特有语法
SET _show_ddl_in_compat_mode = 0;

-- 3. 查看建表语句(会显示索引的 LOCAL/GLOBAL 属性)
SHOW CREATE TABLE test_db.test_table\G

-- 4. 恢复兼容模式
SET _show_ddl_in_compat_mode = 1;
SHOW VARIABLES LIKE '_show_ddl_in_compat_mode';

关键说明:

OceanBase MySQL 模式是 MySQL 语法的超集,包含全局索引等扩展功能。当 _show_ddl_in_compat_mode = 1(MySQL 兼容模式)时,SHOW CREATE TABLE 的输出会被裁剪为纯 MySQL 兼容语法,因此看不到 GLOBAL 关键字。将其设为 0 后,OceanBase 特有的索引属性(如 GLOBAL)才会正常显示。

关闭兼容模式后,你会在建表语句中看到类似以下的输出:

CREATE TABLE `t1` (
  `c1` int(11) DEFAULT NULL,
  KEY `idx1` (`c1`) BLOCK_SIZE 16384 GLOBAL   -- 全局索引
);

CREATE TABLE `t2` (
  `c1` int(11) DEFAULT NULL,
  KEY `idx1` (`c1`) BLOCK_SIZE 16384 LOCAL    -- 本地索引
);

注意:_show_ddl_in_compat_mode 是 session 级别变量,仅影响当前连接,不会影响其他会话或全局配置。


两种方法对比

维度

方法一(sys 租户)

方法二(业务租户)

执行租户

sys 租户

业务租户

查询粒度

表/库/租户级别批量查询

单表查询

是否需切换租户

是

否

输出信息

索引名、类型码、locality 标签

完整建表 DDL(含 LOCAL/GLOBAL)

适用场景

批量巡检、索引架构分析

快速单表确认

方法一适合运维巡检和架构分析,可以一次性获取整个库下所有索引的类型分布。方法二适合开发人员在业务租户下快速确认某张表的索引类型,操作更轻量。两者互补,根据实际场景选择即可。


上一篇 没有了 下一篇 没有了