一、 概述
对于DRDS的数据库的分表,查询时SQL中的where条件尽量会带上分库分表键,这样DRDS会将这个查询路由到具体的分库中,以提高查询效率。如果SQL的where条件中没有分库分表键,DRDS会进行一次全表扫描。针对这种场景,DRDS提供了异构索引来解决这个问题。异构索引会将源表数据实时同步到按照不同字段分库分表的目标表中,以达到使用不同的分库分表键查询数据都不会走全表扫描的目的。
典型的异构索引应用场景是电商网站的订单表,在DRDS中创建结构相同分表键不同的两张表,分别按照买家ID和卖家ID来分库分表,底层将数据实时的从源表同步到目标表,不同用户登录查询时去对应表中查找,避免全表扫描。
本文档将对DRDS的异构索引功能进行创建及测试。
二、 创建异构索引
目前公有云中的异构索引处于内测阶段,只能通过提交工单,由后台人员协助完成创建的方式来使用。需要先在DRDS中建好源表和目标表。本次测试模拟合同信息表来进行测试,对合同表分别创建按照甲方和乙方两个字段分库分表的两张表,contracts_a为源表,contracts_b为目标表。
2.1. 在DRDS中创建源表
CREATE TABLE `contracts_a` ( `cid` int(11) NOT NULL DEFAULT '0', `party_a` varchar(50) DEFAULT NULL, `party_b` varchar(50) DEFAULT NULL, PRIMARY KEY (`cid`), KEY `auto_shard_key_party_a` (`party_a`), KEY `idx_a` (`party_a`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 dbpartition by hash(`party_a`) tbpartition by hash(`party_a`) tbpartitions 2; |
2.2. 在DRDS中创建目标表
CREATE TABLE `contracts_b` ( `cid` int(11) NOT NULL DEFAULT '0', `party_a` varchar(50) DEFAULT NULL, `party_b` varchar(50) DEFAULT NULL, PRIMARY KEY (`cid`), KEY `auto_shard_key_party_b` (`party_b`), KEY `idx_b` (`party_b`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 dbpartition by hash(`party_b`) tbpartition by hash(`party_b`) tbpartitions 2; |
2.3. 提交工单创建异构索引
阿里云控制台—工单—提交工单—DRDS—在描述中写明源表和目标表,要求开通异构索引即可。
三、异构索引功能测试
1. 查看两表数据量
2. 在源表插入数据,查看目标表同步情况
3. 在两表中分别查看不重复的甲方值(contracts_a表是按照甲方party_a分库分表,因此contracts_a表查询效率更快)
4. 在两表中分别查看不重复的乙方值(contracts_b表是按照乙方party_b分库分表,因此contracts_b表查询效率更快)
5. 在两表分别查询某甲方的记录数
6. 在两表分别查询某乙方的记录数
四、结论
如以上测试结果,异构索引会自动将源表数据同步到目标表,并通过提供多种分表键来避免全表扫描,以加快查询速度。