因为 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'; -- 去掉这个过滤条件,可以查看普通租户下所有库里的索引
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)