索引和分区是数据库的关键核心基本功能,OceanBase 是一个单体分布式的架构,具有高性能、高扩展、高可用的特点,索引和分区立了大功。
OceanBase 的索引有局部索引和全局索引。局部索引和全局索引的索引区别在哪里?下面通过实战例子演示如何给 OceanBase 做优化。阅读时注意以下几个优化关键参考指标。
建一个 user1
表并填充一些数据。
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 ;
obclient [tpch]> explain extended select phone ,name from user1 where phone = 1592014286;
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;
obclient [tpch]> explain extended select name, phone from user1 where id= 5000;
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;
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;
create unique index global_idx_phone on user1(phone,name) global ;
explain extended select phone ,name from user1 where phone = 1592014286;
OceanBase 是单体分布式架构的数据库,调优第一原则遵从先单体再分布的特色,简而言之最好内循环把单机性能用光,再外循环使用分布式,力争 LOCAL 优先、REMOTE 为次、DISTRUBTE 是最坏的,综合执行状况要结合扫描数据范围和回表状况来看。
局部索引应用于争取 LOCAL 的场景,避免 DISTRUBTE。场景二、场影三、场影四 使用 LOCAL,但是场景五使用 DISTRUBTE。深思的是必须结合分区键才能完成唯一索引创建。这里内部的逻辑,局部索引要完成跨域,必须要与分区键绑定。
全局索引也可以实现 LOCAL 的场景,见场景六。笔者后续会做 OceanBase 的分布式环境。假设是分布式环境兼数据多的业务场景下,笔者揣测 DISTRUBTE 的机会性较大。
本文关键字:#OceanBase# #索引#
网站声明:如果转载,请联系本站管理员。否则一切后果自行承担。
添加我为好友,拉您入交流群!
请使用微信扫一扫!