相对于单例数据库的查询操作,分布式数据查询会有很多技术难题。本文记录 Mysql 分库分表 和 Elasticsearch Join 查询的实现思路,了解分布式场景数据处理的设计方案。
文章从常用的关系型数据库 MySQL 的分库分表Join 分析,再到非关系型 ElasticSearch 来分析 Join 实现策略。逐步深入Join 的实现机制。
一、Mysql 分库分表 Join 查询场景
分库分表场景下,查询语句如何分发,数据如何组织。相较于NoSQL 数据库,Mysql 在SQL 规范的范围内,相对比较容易适配分布式场景。
基于 sharding-jdbc 中间件的方案,了解整个设计思路。
sharding-jdbc
Code Insight
SQL 路由策略
启用 sql 打印,直观看到实际分发执行的 SQL
sharding-jdbc 根据不同的SQL 语句,会有不同的路由策略。我们关注的 Join 查询,实际相关就是以下两种策略。
StandardRoutingEnginebinding-tables 模式
ComplexRoutingEngine 最复杂的情况,笛卡尔组合关联关系。
二、Elasticsearch Join 查询场景
首先,对于 NoSQL 数据库,要求 Join 查询,可以考虑是不是使用场景和用法有问题。然后,不可避免的,有些场景需要这个功能。Join 查询的实现更贴近SQL 引擎。
基于 elasticsearch-sql 组件的方案,了解大概的实现思路。
elasticsearch-sql
这是个elasticsearch 插件,通过提供http 服务实现类 SQL 查询的功能,高版本的elasticsearch 已经具备该功能⭐
因为 elasticsearch 没有 Join 查询的特性,所以实现 SQL Join 功能,需要提供更加底层的功能,涉及到 Join 算法。
Code Insight
三、More Than Join
Join 算法
常用三种 Join 算法:Nested Loop Join,Hash Join、 Merge Join
MySQL 只支持 NLJ 或其变种,8.0.18 版本后支持 Hash Join
NLJ 相当于两个嵌套循环,用第一张表做 Outter Loop,第二张表做 Inner Loop,Outter Loop 的每一条记录跟 Inner Loop 的记录作比较,最终符合条件的就将该数据记录。
Hash Join 分为两个阶段; build 构建阶段和 probe 探测阶段。
可以使用Explain 查看 MySQL 使用哪种 Join 算法。需要的语法关键字:FORMAT=JSON or FORMAT=Tree
Elasticsearch Nested类型
分析Elasticsearch 业务数据以及使用场景,还有一种选择是直接存储关联信息的文档。在 Elasticsearch 中,是以完整文档形式提供查询和检索,彻底避开使用 Join 相关的技术。
这样就牵扯到关联是归属类型的数据还是公用类型的数据、关联数据量的大小、关联数据的更新频率等。这些都是使用 Nested 类型需要考虑的因素。
更多的使用方法,可以从网上和官网找到,不做赘述。
我们现在有个业务功能正好使用到 Nested类型, 在查询和优化过程中,解决了非常大的难题。
总结
通过运行原理分析,对于运行流程有了清晰和深入的认知。
对于中间件的优化和技术选型更加有目的性,使用上会更加谨慎和小心。
明确的筛选条件,更小的筛选范围,limit 取值数据,都可以减少计算成本,提高性能。
参考资料:
[1] 如何在分布式数据库中实现 Hash Join:https://zhuanlan.zhihu.com/p/35040231
领取专属 10元无门槛券
私享最新 技术干货