咨询一个OB索引问题

【测试环境】

【 OB 4.2.1】
现在有一张表,表结构如下:

CREATE TABLE xxx (

id bigint(20) NOT NULL COMMENT ‘ۼWD?’,

oaid_md5 varchar(64) DEFAULT NULL COMMENT ‘idfa_md5’,

xxx varchar(64) DEFAULT NULL COMMENT ‘xxx’,

xxx varchar(64) DEFAULT NULL COMMENT ‘xxx’,

ts bigint(20) NOT NULL DEFAULT ‘0’ COMMENT ‘ts’,

xxx varchar(1024) DEFAULT NULL COMMENT ‘xxx’,

xxx varchar(128) DEFAULT NULL COMMENT ‘xxx’,

xxx varchar(128) DEFAULT NULL COMMENT ‘xxx’,

xxx varchar(1024) DEFAULT NULL COMMENT ‘xxx’,

xxx varchar(1024) DEFAULT NULL COMMENT ‘xxx’,

xxx varchar(1024) DEFAULT NULL COMMENT ‘xxx’,

xxx varchar(128) DEFAULT NULL COMMENT ‘xxx’,

xxx varchar(128) DEFAULT NULL COMMENT ‘xxx’,

xxx datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT ‘???’,

xxx datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT ‘s??’,

PRIMARY KEY (id),

KEY I_oaid (oaid_md5) BLOCK_SIZE 16384 LOCAL,

KEY I_ts (ts) BLOCK_SIZE 16384 LOCAL

) AUTO_INCREMENT = 731895827 AUTO_INCREMENT_MODE = ‘ORDER’ DEFAULT CHARSET = utf8mb4 ROW_FORMAT = DYNAMIC COMPRESSION = ‘zstd_1.3.8’ REPLICA_NUM = 3 BLOCK_SIZE = 16384 USE_BLOOM_FILTER = FALSE TABLET_SIZE = 134217728 PCTFREE = 0

partition by hash(id)

(partition p0,

partition p1,

partition p2,

partition p3,

partition p4,

partition p5,

partition p6,

partition p7,

partition p8,

partition p9,

partition p10,

partition p11,

partition p12,

partition p13,

partition p14,

partition p15,

partition p16,

partition p17,

partition p18,

partition p19,

partition p20,

partition p21,

partition p22,

partition p23,

partition p24,

partition p25,

partition p26,

partition p27,

partition p28,

partition p29)

in的范围为200条数据

SQL1

select max(id) from xxx where oaid_md5 in

‘xxx’

‘xxx’

SQL2

select max(ts) from dwd_ads_mis_channel_show_dd where oaid_md5 in

‘xxx’

‘xxx’

SQL1只需要80ms , SQL2却需要3s

1、建议explain 查看一下执行计划分析;

2、提供的SQL语句中ID是主键,SQL1与SQL2的区别是查询的投影列不同SQL1是max(id),SQL2是max(ts),where条件都是oaid_md5 in(…);语句走索引 I_oaid;

3、你建的是local索引,索引是包含分区键id,所以SQL是不需要回表,直接扫描该索引(索引里面包含了oaid_md5,id);而sql2除了扫描索引后还需要回表查ts列,效率应该是SQL1高。


把ts索引从local改为global是不是会快

1、全局也不一定快,还要看数据分布情况,如果对其他写入不影响,考虑索引覆盖建联合索引,减少回表。
2、explain extend查看执行计划吧,可以查到多信息。

怎么减少回表这个能详细说下吗

SQL1不需要回表,是因为索引中记录的索引列是键,主键是值,所以你查询max(id)不需要回表,因为id也在索引结构里面,同理,ts不在i_oaid索引结构里面,所以需要通过oaid_md5去定位id后,再通过回表查询ts的值。

1 个赞

你如果把oaid_md5和ts建立一个联合索引,因为ts也在索引结构里面,可以直接定位,就不需要回表了

好的,我试试哈

explain命令的Outputs & filters:中有记录是否回表的,比如你的计划中找到id为6的outputs,is_index_back=true就代表回表。