如何查询 OceanBase MySQL 索引是本地还是全局?
适用版本: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 级别变量,仅影响当前连接,不会影响其他会话或全局配置。
两种方法对比
方法一适合运维巡检和架构分析,可以一次性获取整个库下所有索引的类型分布。方法二适合开发人员在业务租户下快速确认某张表的索引类型,操作更轻量。两者互补,根据实际场景选择即可。