阿里云 DRDS 分库分表二维查询解决方案(RANGE_HASH拆分函数)

本文涉及的产品
云数据库 RDS MySQL,集群版 2核4GB 100GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云原生数据库 PolarDB 分布式版,标准版 2核8GB
简介:

现有互联网业务模式下,数据库分库分表已经成为解决数据库瓶颈的一个普遍的解决方案。分库分表有多种好处,比如高容量、大并发等,但是在拆分过程中也引入了一些使用限制,比如多维查询,非拆分键的查询请求会分发到底层所有实例进行查询,性能会大打折扣。

我们来举个例子,最常见的订单表,常用的拆分方法是按照用户 ID 作为拆分键。如果仅使用订单号作为条件来查询则会出现上述性能问题,而仅通过订单号的查询请求恰恰占有不小的比例。

在阿里云提供的新版 DRDS(5.1.28-1320920 及其以上的版本)已经实现二维查询的功能。看看他的特性 RANGE_HASH(COL1, COL2, N) :

  • 拆分键的类型必须是字符类型或数字类型
  • 根据任一拆分键后 N 位计算哈希值,然后再按分库数去取余,完成路由计算。N 为函数第三个参数。例如:RANGE_HASH(COL1, COL2, N) ,计算时会优先选择 COL1,截取其后N位进行计算。 COL1 不存在时找 COL2。
  • 适合于需要有两个拆分键,并且查询时仅有其中一个拆分键值的场景。
  • 两个拆分键皆不能修改。
  • 插入数据时如果发现两个拆分键指向不同的分库或分表时,插入会失败。

针对上一个例子,使用这个功能就可以解决问题。可以这样设计订单表,拆分键选择 user_id & order_id,在 order_id 中冗余 user_id 后 N 位。这样使用 RANGE_HASH(user_id, order_id, N) 功能即可以实现仅使用 user_id 或 order_id 条件就可以快速查询所需要的数据。

DRDS 表结构:

mysql> show create table test_order_rangehash\G
*************************** 1. row ***************************
       Table: test_order_rangehash
Create Table: CREATE TABLE `test_order_rangehash` (
  `id` int(11) NOT NULL AUTO_INCREMENT BY GROUP,
  `user_id` int(11) DEFAULT NULL,
  `order_id` bigint(20) DEFAULT NULL,
  `create_time` datetime DEFAULT NULL,
  PRIMARY KEY (`id`),
  KEY `auto_shard_key_ORDER_ID` (`order_id`),
  KEY `auto_shard_key_USER_ID` (`user_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 dbpartition by RANGE_HASH(`user_id`, `order_id`, 4)

底层数据库表结构:

mysql>show create table test_order_rangehash\G
*************************** 1. row ***************************
       Table: test_order_rangehash
Create Table: CREATE TABLE `test_order_rangehash` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `user_id` int(11) DEFAULT NULL,
  `order_id` bigint(20) DEFAULT NULL,
  `create_time` datetime DEFAULT NULL,
  PRIMARY KEY (`id`),
  KEY `auto_shard_key_ORDER_ID` (`order_id`),
  KEY `auto_shard_key_USER_ID` (`user_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8

拆分键所插入值指向不同分库即会报错:

mysql> insert into test_order_rangehash (user_id, order_id, create_time) values (100000001, 20170818111111100002,now());
ERROR 4300 (HY000): ERR-CODE: [TDDL-4300][ERR_ROUTE] Route : Range hash has mul rules, insert shard columns must be equal by rule. More: [http://middleware.alibaba-inc.com/faq/faqByFaqCode.html?faqCode=TDDL-4300]

仅使用 user_id 或 order_id 作为查询条件,均能准确定位到后段数据库:

mysql> explain select * from test_order_rangehash where user_id = 100000022\G
*************************** 1. row ***************************
GROUP_NAME: DCWEB_1498027405059FQIYDCWEB_JDLT_0022_RDS
       SQL: select `test_order_rangehash`.`id`,`test_order_rangehash`.`user_id`,`test_order_rangehash`.`order_id`,`test_order_rangehash`.`create_time` from `test_order_rangehash` where (`test_order_rangehash`.`user_id` = 100000022)
    PARAMS: {}
1 row in set (0.04 sec)

mysql> explain select * from test_order_rangehash where order_id = 2017081811113220022\G
*************************** 1. row ***************************
GROUP_NAME: DCWEB_1498027405059FQIYDCWEB_JDLT_0022_RDS
       SQL: select `test_order_rangehash`.`id`,`test_order_rangehash`.`user_id`,`test_order_rangehash`.`order_id`,`test_order_rangehash`.`create_time` from `test_order_rangehash` where (`test_order_rangehash`.`order_id` = 2017081811113220022)
    PARAMS: {}
1 row in set (0.03 sec)

结语:多维查询还可以使用异构索引来实现,但 RANGE_HASH 岂不更好。当然它不是万能的,某些场景下还是要选择异构索引(比如订单表以买家、卖家维度查询)。

相关实践学习
快速体验PolarDB开源数据库
本实验环境已内置PostgreSQL数据库以及PolarDB开源数据库:PolarDB PostgreSQL版和PolarDB分布式版,支持一键拉起使用,方便各位开发者学习使用。
目录
相关文章
|
21天前
|
Web App开发 编解码 资源调度
在阿里云直播解决方案中,当使用ARTC协议观看直播并进行清晰度切换时出现画面卡顿或马赛克现象,可能存在以下几种原因
【6月更文挑战第30天】阿里云直播中,ARTC协议下清晰度切换出现卡顿或马赛克可能由网络带宽、缓冲策略、转码效率、播放器解码、协议特点及服务器资源调度引起。解决措施包括优化网络、智能切换算法、播放器与服务器优化。通过监控和日志分析定位问题,参照官方最佳实践进行优化。
55 1
|
23天前
|
敏捷开发 测试技术 API
阿里云云效产品使用问题之如何通过API查询指定人在指定时间内提交了多少行代码
云效作为一款全面覆盖研发全生命周期管理的云端效能平台,致力于帮助企业实现高效协同、敏捷研发和持续交付。本合集收集整理了用户在使用云效过程中遇到的常见问题,问题涉及项目创建与管理、需求规划与迭代、代码托管与版本控制、自动化测试、持续集成与发布等方面。
|
1月前
|
Linux 网络安全
杨老师课堂之关于阿里云Centos7 如何设置权限的解决方案
杨老师课堂之关于阿里云Centos7 如何设置权限的解决方案
26 0
|
13天前
|
缓存 运维 关系型数据库
数据库容灾 | MySQL MGR与阿里云PolarDB-X Paxos的深度对比
经过深入的技术剖析与性能对比,PolarDB-X DN凭借其自研的X-Paxos协议和一系列优化设计,在性能、正确性、可用性及资源开销等方面展现出对MySQL MGR的多项优势,但MGR在MySQL生态体系内也占据重要地位,但需要考虑备库宕机抖动、跨机房容灾性能波动、稳定性等各种情况,因此如果想用好MGR,必须配备专业的技术和运维团队的支持。 在面对大规模、高并发、高可用性需求时,PolarDB-X存储引擎以其独特的技术优势和优异的性能表现,相比于MGR在开箱即用的场景下,PolarDB-X基于DN的集中式(标准版)在功能和性能都做到了很好的平衡,成为了极具竞争力的数据库解决方案。
|
1月前
|
人工智能 API
阿里云的通义万相文本绘图与人像美化解决方案的体验感受
通义万相文本绘图与人像美化解决方案是一个非常有潜力的产品,它不仅能够提高设计师和艺术家的创作效率,也为AI图像生成领域带来了新的可能性。非常期待它未来的发展和应用。
96 40
|
26天前
|
弹性计算
阿里云服务器99元和199元提示“不符合活动条件”或显示价格为原价的解决方案
2024年阿里云推出了两款长效特惠云服务器,经济型e实例2核2G配置3M固定带宽40G ESSD Entry云盘,价格只要99元1年,通用算力型u1实例2核4G配置5M固定带宽80G ESSD Entry云盘,价格只要199元1年,而且购买之后还能享受续费同价的政策,这两款云服务器的购买资格为新老用户同享,但是还是有部分用户在购买时会提示“不符合活动条件”或者显示的价格是原价,本文为大家解析出现这一情况的原因是什么呢,以及我们应该如何解决。
阿里云服务器99元和199元提示“不符合活动条件”或显示价格为原价的解决方案
|
3天前
|
域名解析 运维 Java
阿里云云效操作报错合集之流水线构建过程中出现了实时查询异常,该怎么解决
本合集将整理呈现用户在使用过程中遇到的报错及其对应的解决办法,包括但不限于账户权限设置错误、项目配置不正确、代码提交冲突、构建任务执行失败、测试环境异常、需求流转阻塞等问题。阿里云云效是一站式企业级研发协同和DevOps平台,为企业提供从需求规划、开发、测试、发布到运维、运营的全流程端到端服务和工具支撑,致力于提升企业的研发效能和创新能力。
|
6天前
|
弹性计算 异构计算
阿里云服务器租用多少钱一年?在哪查询价格表?
阿里云服务器包括ECS、轻量应用服务器和GPU实例,价格因配置而异。例如,ECS经济型2核2G年付99元,轻量应用服务器2核4G年付298元。要查看最新价格和具体配置,可访问阿里云官方网站的ECS页面
|
18天前
|
关系型数据库 分布式数据库 数据库
PolarDB,阿里云的开源分布式数据库,与微服务相结合,提供灵活扩展和高效管理解决方案。
【7月更文挑战第3天】PolarDB,阿里云的开源分布式数据库,与微服务相结合,提供灵活扩展和高效管理解决方案。通过数据分片和水平扩展支持微服务弹性,保证高可用性,且兼容MySQL协议,简化集成。示例展示了如何使用Spring Boot配置PolarDB,实现服务动态扩展。PolarDB缓解了微服务数据库挑战,加速了开发部署,为云原生应用奠定基础。
163 3
|
18天前
|
存储 弹性计算 大数据
阿里云ECS以其强大的弹性计算与存储能力,为大数据处理提供了灵活、高效、成本优化的解决方案
阿里云ECS在大数据处理中发挥关键作用,提供多样化实例规格适应不同需求,如大数据型实例适合离线计算。ECS与OSS集成实现大规模存储,通过Auto Scaling动态调整资源,确保高效运算。案例显示,使用ECS处理TB级数据,速度提升3倍,成本降低40%,展现其在弹性、效率和成本优化方面的优势。结合阿里云生态系统,ECS助力企业数据驱动创新。
32 1