在设计索引时,重要的是考虑查询条件是哪些列以及他们的顺序,以下是一些具体的建议:
需要满足索引前缀的要求,如果当前有一个(A,B,C)索引,查询条件为(A)或(A,B)都是可以
通过索引进行查询的,但(B)或(B,C)是无非是通过索引查询的。这意味着尽可能的避免创建
单列索引,增加索引的通用性,即可在多个场景下复用。
谓词条件中出现的列,需要注意等于和包含条件(= ,in),必须出现在范围(<,>)条件之前。
否则无法通过索引查。
索引中可以存储查用列,来避免回表的情况。命中率高的查询,是否回表对查询速度,将产生非常
大的影响。
尽量避免大表后建索引的情况
hubble数据库具备在线建索引的特性,且在建索引过程中,不会出现锁表的情况。但我们需要注意一
点,hubble数据库在完成创建索引前,需要做索引与数据一致性校验的必要动作,这个行为对于超大数
据量的表,无法避免的是一个大IO的任务。如果无法为超大数据量表创建索引,提供合理的运维窗口,
请给这个索引创建任务留出较大的时间窗口,耐心等待即可,尤其在非SSD存储介质基础上。当然几亿
数据的表,创建索引还是可以保证效率的,这里的大表,是指10亿、20亿上的表。
连接数的合理规划
hubble数据库创建多个活动连接,可以有效的使用可用的数据库资源。对于创建连接需要经过身份验证
的过程,这个过程是cpu和内存密集型的,客户端等待数据库验证连接的过程中还增加了延迟。因此合
理的控制连接数是必要的工作。我们建议连接数的量参考集群core数量进行衡量,计算公式是core数据
的两倍。
当然HA proxy模式也对连接数的规划会产生影响,如较高维度分析型的并发任务,实际最优连接数会比
计算公式得出的结果要低。如果集群使用ssd硬盘,能一定程度提升连接数的上限。
如应用类程序使用连接池,除了设置最大连接池大小外,还必须设置空闲连接池大小。我们的建议是将
空间连接池大小设置为最大连接池相等。这个设置可能会占用更多的应用程序服务器内存,但在并发较
高的情况中,可以避免创建新连接带来的性能损耗。
建表复制数据 CREATE TABLE AS SELECT
当执行 CREATE TABLE AS SELECT 语句进行建表并且进行数据复制的时候,将会导致新创建的表中丢
失 主键分区和外键 等约束。影响数据检索查询效率。强烈推荐先执行 create table t2( like t1
INCLUDING ALL EXCLUDING CONSTRAINTS )复制表结构和约束 ,再执行 insert into T2 select *
from T1 方式导入数据。
参考示例如下:
SQL规范建议
使用UUID生成唯一主键
建表设计过程中,无法使用业务字段作为主键,我们建议使用UUID来作为主键字段。这能提供更好的数
据分布情况。
CREATE TABLE t1 (id INT PRIMARY KEY, name INT NOT NULL, INDEX(name));
CREATE TABLE t2 (LIKE t1 INCLUDING ALL EXCLUDING CONSTRAINTS);
insert into T2 select * from T1;
评论