PolarDB IMCI助力聚水潭数据中台极致体验,实现百亿级订单实时分析
1.前言
2.数据中台的产品能力
2.1 实时大屏
秒级更新的数据大屏可以说是企业经营管理层的驾驶舱,可以直观、全面的了解到每天的销售、发货情况,同时可以更快、更精准地发现问题,防控风险,提高管理的时效性。
数据中台大屏 示意图
2.2 发货预警
发货预警 示意图
物流实时预警 示意图
赔付风险订单预警 示意图
更多主播、售后、商品、合作商家的功能就不一一展开了,关于产品的介绍及商家使用反馈可移步《双11,他们都在聚水潭数据中台里看什么?》
3.数据中台是如何使用PolarDB IMCI的?
3.1 PolarDB IMCI的技术特点
IMCI是In-Memory Column Index的缩写,是在已有MySQL行存表Btree索引的基础上,扩展列存形式的索引,从其名称中也不难看出,行列索引共享了基础表的数据,从而让普通的MySQL表具备了同时支持行列场景的查询需求,可以称得上是行列共存表,列存索引特性在PolarDB MySQL引擎中的功能架构图如下:
列存索引特性在PolarDB MySQL引擎中的功能架构图
存储引擎:支持实时事务级别一致性的行列混合存储; 执行算子:面向列存的向量化并行执行算子,支持极速的单表和多表查询; SQL Parser/优化器:面向行列混合存储的CBO优化器,可以根据代价自动选择行存或者列存执行查询请求;
在此架构下,是的原有PolarDB MySQL具备如下优势:
100%兼容MySQL:列存具有与MySQL一致的数据类型系统,支持灵活的类型转换,100%兼容MySQL协议; 极致的HTAP性能:PolarDB在OLTP方面本身具备极致性能。列存索引使其OLAP性能也与专用的OLAP数据库系统处于同一水平; 行列混合存储,降低成本:同时支持行存储和列存储两种格式,且实时保证行列的事务级一致,同时,列存更具有低成本的优势。
3.2 基于PolarDB IMCI的数仓架构
聚水潭实时数仓架构图
1. 资源隔离:复杂的OLAP查询与RW节点完全的资源隔离,OLTP和OLAP的请求互不受影响。
2. 自动分离:PolarDB提供的自动SQL分流功能,自动的将复杂查询指向分析型只读节点,业务无需手动对OLTP型SQL和OLAP型SQL进行手动分流。
这些能力帮助数据研发团队极大的提升研发速度,从而助力产品的快速迭代。
3.3 PolarDB IMCI是如何支撑百亿级的订单分析?
SELECT sku_id
,max(sku_name) sku_name
,sum(order_item_amt) order_item_amt
FROM (
SELECT sku_id
,sku_name
,order_item_amt
FROM ads_jst_erp_dataportal_shop_sku_detail --店铺自营商品售后指标表
WHERE co_id = $coId
#if($startDate && $startDate != '') -- 开始时间&结束时间
AND biz_date >= '$startDate'
#else
AND biz_date >= date_add($globalTime ,interval - (replace('$statisticsPreriod','d','') - 1) DAY)
#end
#if($endDate && $endDate != '')
AND biz_date <= '$endDate'
#else
AND biz_date <= $globalTime
#end
#if($skuId && $skuId != '') -- 商品编码
AND sku_id LIKE '%$skuId%'
#end
#if($skuName && $skuName != '') -- 商品名称
AND sku_name LIKE '%$skuName%'
#end
) temp_sku_data
GROUP BY sku_id
;
SELECT sku_id
,max(sku_name) as sku_name
,sum(order_item_amt) order_item_amt
FROM (
SELECT sku_id
,sku_name
,sum(order_item_amt) order_item_amt
from ads_jst_erp_dataportal_shop_sku_detail --店铺自营商品售后指标表
WHERE co_id = $coId
#if($startDate && $startDate != '') -- 开始时间&结束时间
AND biz_date >= '$startDate'
#else
AND biz_date >= date_add($globalTime ,interval - (replace('$statisticsPreriod','d','') - 1) DAY)
#end
#if($endDate && $endDate != '')
AND biz_date <= '$endDate'
#else
AND biz_date <= $globalTime #end #if($authShopIds && $!authShopIds != '') -- 多个渠道
AND shop_id IN ( #foreach($authShopId IN $authShopIds) $authShopId, #end - 999)
#end
#if(($shopIds && $shopIds != '') | | ($platforms && $platforms != ''))
and (
1 = 0
#if($shopIds && $shopIds != '')
OR shop_id IN ( #foreach($shopId IN $shopIds) $shopId, #end - 999)
#end
#if($platforms && $platforms != '')
OR platform IN ( #foreach($platform IN $platforms) '$platform', #end '-999')
#end
)
#end
#if($skuId && $skuId != '') -- 商品编码
AND sku_id LIKE '%$skuId%'
#end
#if($skuName && $skuName != '') -- 商品名称
AND sku_name LIKE '%$skuName%'
#end
) temp_sku_data
GROUP BY sku_id
;
对于第一个场景通过增加
CREATE TABLE `ads_jst_erp_dataportal_shop_sku_detail` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`biz_date` varchar(15) COLLATE utf8mb4_bin DEFAULT NULL COMMENT '业务日期(yyyy-mm-dd)',
`co_id` int(11) DEFAULT NULL COMMENT '商家编号',
`shop_id` int(11) DEFAULT NULL COMMENT '店铺编号',
`shop_name` text COLLATE utf8mb4_bin COMMENT '店铺名称',
`platform` varchar(15) COLLATE utf8mb4_bin DEFAULT NULL COMMENT '平台',
`sku_id` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL COMMENT '商品编码',
`sku_name` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '商品名称',
`order_item_amt` decimal(38,6) DEFAULT NULL COMMENT '今日确认退款金额'
PRIMARY KEY (`id`),
KEY `idx_co_sku_bizdate` (`co_id`,`sku_id`,`biz_date`),
COLUMNAR INDEX (`id`,`biz_date`,`co_id`,`shop_id`,`shop_name`,`sku_id`,`sku_name`,`platform`,`order_item_amt`)
店铺自营商品售后统计指标表
使用列存索引后SQL查询性能提升超过100倍,同时借助PolarDB Proxy节点的智能路由能力,OLAP查询可以自动路由至PolarDB IMCI节点并选择列存索引执行SQL,做到了OLTP和OLAP架构一体化的体验。
1. 数据量巨大,达到100亿级别,普通的MySQL表索引遇到瓶颈;
1. 架构创新:Flink+PolarDB升级实时数仓新引擎,支持百万级商家全渠道数据实时分析;
2. 降本增效:统一HTAP架构,OLTP+OLAP混合负载,助力数据中台产品快速迭代;
/ End /