OceanBase 全局索引与局部索引探索

OceanBase 全局索引与局部索引探索导致的本区域查找和跨区域查找。

作者:网名大数据模型,对制造业、银行业、通讯业了解多一点,关心专注国产数据库技术布道以及数据资产建设的应用实践。

爱可生开源社区出品,原创内容未经授权不得随意使用,转载请联系小编并注明来源。

本文约 1200 字,预计阅读需要 4 分钟。

OceanBase 的索引

索引和分区是数据库的关键核心基本功能,OceanBase 是一个单体分布式的架构,具有高性能、高扩展、高可用的特点,索引和分区立了大功。

OceanBase 的索引有局部索引和全局索引。局部索引和全局索引的索引区别在哪里?下面通过实战例子演示如何给 OceanBase 做优化。 阅读时注意以下几个优化关键参考指标。

  • is_index_back:表示查询 SQL 是否已经回表,数值是 off 是最好。
  • is_global_index:表示是否已经激活全局索引。
  • physical_range_rows:表示读取的物理范围行,数值越小越好。
  • logical_range_rows 表示读取的逻辑范围行,数值越小越好。
  • Plan type :有 3 个选项,最优是 LOCAL 对应本地调用,REMOTE 对应远程调用,最坏情况是 DISTRIBUTED。

准备环境

建一个 user1 表并填充一些数据。

sql 复制代码
CREATE TABLE `user1` (
  `id` int(11) DEFAULT NULL,
  `name` varchar(100) DEFAULT NULL,
  `phone` int(12) DEFAULT NULL,
  `address` varchar(100) DEFAULT NULL
) partition by hash(id+1) partitions 3;
obclient [tpch]> select count(*) from  user1
    -> ;
+----------+
| count(*) |
+----------+
|    79993 |
+----------+
1 row in set (0.025 sec)


delimiter //
create procedure bulk_user()
begin
declare i int;
declare phone int;
 set i=100000;
 set phone=1592014273;
 while i<1000001 do
   insert INTO user (id,name ,phone,address) values (i,'yang',phone+i,'address');
 set i=i+1;
 end while;
end
//
delimiter ;

索引使用场景

场景一:没有加索引

sql 复制代码
obclient [tpch]> explain extended  select phone ,name  from  user1 where   phone = 1592014286;

索引测试,没有加索引前,对全盘进行扫描找到了目标对象,操作过程中产生没有产生回表。

场景二:加了局部索引

sql 复制代码
obclient [tpch]> create index idx_user1_phone on user1 (phone) local;
Query OK, 0 rows affected (3.152 sec)

explain extended select phone,name from user1 where phone = 1592014286;

索引测试,加了局部索引后,对硬盘扫描只查找了 791 行,操作过程中居然产生了回表操作。

场景三:分区查找

sql 复制代码
obclient [tpch]> explain extended select name, phone  from user1  where  id= 5000;

分区测试,通过分区为关键字查找,按划分的分区【26664】查找,由于没有索引设置,遍历所有的26664,没有产生回表。

场景四:分区加索引进行查找

sql 复制代码
obclient [tpch]>  create index idx_user1_id on user1 (id) local;
Query OK, 0 rows affected (3.379 sec)
obclient [tpch]> explain extended select name, phone  from user1  where  id= 5000;

分区加索引测试,id 即是索引也是分区。设置索引后按划分的分区【26664】查找,physical_range_rowslogical_range_rows 成绩喜人,但是发生回表的操作。

为什么产生回表?主要语句有 select name, phoneid 是虽然做了索引,但namephone 是投影,从而做了回表。

场景五:创建唯一索引消灭回表

sql 复制代码
obclient [tpch]> create  unique index  idx_user_phone_name  on  user1 (phone,name) local ;
ERROR 1503 (HY000): A UNIQUE INDEX must include all columns in the table's partitioning function

提示 1503 错误,创建唯一索引必须指定分区的指定

obclient [tpch]> create  unique index  idx_user_id_phone_name  on  user1 (phone,name,id) local ;
Query OK, 0 rows affected (3.352 sec)

explain extended  select phone ,name  from  user1 where   phone = 1592014286;

为什么唯一索引必须内含内含分区 ID,必须是唯一性,必须包括主键列,基于局部索引加上唯一索引,不产生回表。

场景六:创建全局索引消灭回表

sql 复制代码
create unique index   global_idx_phone  on  user1(phone,name) global ;

explain extended  select phone ,name  from  user1 where   phone = 1592014286;

全局索引按照 phonename 也可以消来回表。

总结

OceanBase 是单体分布式架构的数据库,调优第一原则遵从先单体再分布的特色,简而言之最好内循环把单机性能用光,再外循环使用分布式,力争 LOCAL 优先、REMOTE 为次、DISTRUBTE 是最坏的,综合执行状况要结合扫描数据范围和回表状况来看。

局部索引应用于争取 LOCAL 的场景,避免 DISTRUBTE。场景二、场影三、场影四 使用 LOCAL,但是场景五使用 DISTRUBTE。深思的是必须结合分区键才能完成唯一索引创建。这里内部的逻辑,局部索引要完成跨域,必须要与分区键绑定。

全局索引也可以实现 LOCAL 的场景,见场景六。笔者后续会做 OceanBase 的分布式环境。假设是分布式环境兼数据多的业务场景下,笔者揣测 DISTRUBTE 的机会性较大。

更多技术文章,请访问:opensource.actionsky.com/

关于 SQLE

SQLE 是一款全方位的 SQL 质量管理平台,覆盖开发至生产环境的 SQL 审核和管理。支持主流的开源、商业、国产数据库,为开发和运维提供流程自动化能力,提升上线效率,提高数据质量。

相关推荐
csdn_aspnet33 分钟前
mysql 使用逗号拼接一列数据
数据库·mysql·group_concat
大师兄66681 小时前
HarmonyOS7 数据持久化 relationalStore:数据库实战
数据库·arkui·实战案例·harmonyos7
TDengine (老段)1 小时前
TDengine SMA 索引 — 块级/文件级统计索引
android·大数据·服务器·数据库·人工智能·时序数据库·tdengine
冰茶丿1 小时前
状态机在嵌入式系统中的应用:不只是switch-case这么简单
数据库·嵌入式硬件·mongodb
AIHR数智引擎1 小时前
15%对撞40%:WEF白皮书里的AI组织隐忧
数据库·人工智能·经验分享·职场和发展·aihr
卓怡学长1 小时前
w261springboot基于web学校课程管理系统
java·数据库·spring boot·spring·intellij-idea
嘉泰姆半导体官方1 小时前
CXAR41337C 双通道数字音频功放 | 2×20W | EQ+DRC | I²S | MCLK-Less - 嘉泰姆电子
前端·javascript·数据库
不坑老师2 小时前
怎么在Word中制作汉字书写笔顺——不坑盒子汉字笔顺步骤在小学低段识字教学中的应用
前端·数据库·人工智能·word·excel·office
苍狼唤2 小时前
SQL+C# 增删改查(练习)
数据库·sql·c#
2301_800256112 小时前
第七章 空间存储与索引 知识点梳理-2
数据库·sql·oracle