type
status
date
slug
summary
tags
category
icon
password
AI 摘要
项目上的系统已经上线很多年,数据量积累的越来越多,有些单表甚至超过了 2 千万条数据,导致系统查询时,只有涉及到这些大表就会变得很慢,很影响使用系统的体验。
于是将这些大表迁移到 StartRocks 数据库,之前还只没有听说过这个数据库,查了下官网介绍如下:
StarRocks 是一款高性能分析型数据仓库,使用向量化、MPP 架构、CBO、智能物化视图、可实时更新的列式存储引擎等技术实现多维、实时、高并发的数据分析。StarRocks 既支持从各类实时和离线的数据源高效导入数据,也支持直接分析数据湖上各种格式的数据。StarRocks 兼容 MySQL 协议,可使用 MySQL 客户端和常用 BI 工具对接。同时 StarRocks 具备水平扩展,高可用、高可靠、易运维等特性。广泛应用于实时数仓、OLAP 报表、数据湖分析等场景。
关键点是兼容 Mysql 协议,因为当前项目上的系统就是使用的 Mysql,这样切换成 StartRocks 基本不需要做什么改动。
因为只是部分查询接入 StartRocks,因此需要通过动态切换数据源来实现,具体实现这里不展开,只记录问题
版本说明:Mysql 5.7.25,StartRocks 2.5.17
问题记录
子查询
对接过程中,有一个查询的 SQL 中在 Where 中使用到了子查询,切换成 StartRocks 查询时报错:
Subquery in left-side child of in-predicate is not supported
于是将子查询更换为 EXISTS 语法查询,但又出现另外一个报错:
Currently only subquery of the Select type are supported
因为当前子查询中使用到了
UNION ALL
,看提示应该也是不支持于是将
UNION ALL
联合的两个子查询分开,分别使用EXISTS
去查询,经验证 StartRocks 查询无问题group_concat
部分语法不支持
最新版本文档中对group_concat的介绍中有提到
- 从 3.0.6,3.1.3 版本开始,group_concat 支持使用 DISTINCT 和 ORDER BY
- 从 v3.0.6 和 v3.1.3 版本起,分隔符必须使用
SEPARATOR
关键字来声明
由于本文环境使用的StartRocks版本为2.5.17,所以group_concat不支持使用
DISTINCT
、ORDER BY
和SEPARATOR
在使用过程中会有些差异,比如以下SQL
在Mysql中查询结果为
但是在StartRocks中查询的结果为
可以看到区别在于
- Mysql中如果没有使用
SEPARATOR
指定分隔符的话,是先按指定字符拼接,再拼接默认的分隔符-逗号
- StartRocks中因为这里是2.5版本不支持使用
SEPARATOR
但其实默认第二个参数就是指定分隔符,因为结果只是按分隔符进行了拼接
因此,如果我们想让StartRocks展示效果与Mysql一样,则需要把SQL进行改造
改造后在StartRocks中查询结果如下,与Mysql展示的结果一致
Loading...