【运维技巧分享】如何查看所有索引的 local / global 属性?

因为 global 索引有 MySQL 兼容性问题,所以产品同学迟迟不肯提供相关字典视图给用户查看。

今天看到有布道师大佬 @和顺 写了一篇社区博客介绍说,OB 4251 版本终于开始支持在字典视图里查 index type,然后还给了几种查询方法。

简单看了一眼,4251 版本提供的查字典视图用来查询 index type 的 SQL 好像也很复杂,还需要视图 join 视图,看得我真是一脸懵逼……

感觉还不如直接查下内部表,SQL 又简短,性能要高效,还能在 OB 0.x ~ 4.x 所有的版本都生效,在这里分享给大家。

这里是实属迫不得已,只得放弃字典视图,改查内部表(其他情况大家还是尽量去查字典视图):

-- 在社区版普通租户(非 sys 租户)下执行的 SQL,查看 test 库下的索引类型
SELECT
  db.database_name,
  tbl.table_name data_table_name,
  substr(idx.table_name, 7 + instr(substr(idx.table_name, 7), '_')) index_name,
  case when idx.index_type in (1, 2) then 'local'
       when idx.index_type in (3, 4, 7, 8) then 'global'
  end as index_type
FROM oceanbase.__all_table idx,
     oceanbase.__all_table tbl,
     oceanbase.__all_database db
WHERE tbl.database_id = db.database_id
  and idx.data_table_id = tbl.table_id
  and db.database_name = 'test'; -- 去掉这个过滤条件,可以查看普通租户下所有库里的索引

至于 SQL 里的 index type 是啥,以及为啥 global index 的 index type 比 local index 多两种,其实并不重要。对这些问题感兴趣的老师们,可以阅读这篇博客:《为什么我创建的 global index 会自动变成 local index?》

18 个赞

接下来试用一下,看看效果。

先创建两张表:

create table t1(c1 int, index idx1(c1) global);

show create table t1\G
*************************** 1. row ***************************
       Table: t1
Create Table: CREATE TABLE `t1` (
  `c1` int(11) DEFAULT NULL,
  KEY `idx1` (`c1`) BLOCK_SIZE 16384 GLOBAL
)
create table t2(c1 int, index idx1(c1));

show create table t2\G
*************************** 1. row ***************************
       Table: t2
Create Table: CREATE TABLE `t2` (
  `c1` int(11) DEFAULT NULL,
  KEY `idx1` (`c1`) BLOCK_SIZE 16384 LOCAL
)

查询一下试试:

SELECT
  db.database_name,
  tbl.table_name data_table_name,
  substr(idx.table_name, 7 + instr(substr(idx.table_name, 7), '_')) index_name,
  case when idx.index_type in (1, 2) then 'local'
       when idx.index_type in (3, 4, 7, 8) then 'global'
  end as index_type
FROM oceanbase.__all_table idx,
     oceanbase.__all_table tbl,
     oceanbase.__all_database db
WHERE tbl.database_id = db.database_id
  and idx.data_table_id = tbl.table_id
  and db.database_name = 'test';
+---------------+-----------------+------------+------------+
| database_name | data_table_name | index_name | index_type |
+---------------+-----------------+------------+------------+
| test          | t1              | idx1       | global     |
| test          | t2              | idx1       | local      |
+---------------+-----------------+------------+------------+
2 rows in set (0.12 sec)
15 个赞

写完收工~

说明:

这条 SQL 用于查看当前普通用户租户下所有普通索引的 global/local 属性(可以指定 database_name 或 table_name 啥的做一些过滤)。普通索引指的是除去空间索引、向量索引、全文索引以外的其他索引。

如果只看一张表中的 index 的 global/local 属性,直接 show create table 就好了~

14 个赞

参考:

15 个赞

我自己弄的obdiag display的一个yaml场景就是类似这个,不过把索引所有字段顺序也都查出来了

16 个赞

哈哈,我最近也想在 @靖顺 老哥的 obdiag display 搞点儿东西玩玩儿!

13 个赞

使用 SHOW FULL TABLES 命令
OceanBase 支持通过 SHOW FULL TABLES 查看所有表和视图,并通过 Table_type 区分是表还是视图

13 个赞

需求是想看库里所有索引的 global / local 属性,不是看是普通表还是视图。

还有老哥,你别老用 AI 在论坛里乱发、乱回东西搞破坏呀……

15 个赞

学习了

14 个赞

刚学习3版本,然后发现4好多数据字典都变了

11 个赞

别学 3.x 了,直接学 4.x !

12 个赞

直接4.x 起走

9 个赞

说是4相较于3变化挺大的,直接学4吧

9 个赞

可以,还留下了很多发挥空间,比如索引的分区情况、字段顺序啥的都能扩展出来

10 个赞

:+1::+1::+1::+1:

6 个赞

:+1::+1::+1::+1::+1:

5 个赞

学到了,谢谢

5 个赞

:+1: :+1: :+1: :+1: :+1:

5 个赞

学习了!

4 个赞

变化很大 很多数据字典都变了

2 个赞