多维度查询的最佳实践

普通的数据库查询,很难实现上述需求场景,更不用提模糊查询、全文检索了。下面结合楼主的经验和知识,介绍初级方案、进阶方案(上ElasticSearch),大部分情况下推荐使用ElasticSearch来实现多维度查询,赶时间的读者可以直接跳到“进阶方案:将ElasticSearch添加到现有系统中”。...
摘要由CSDN通过智能技术生成

背景

有2种常见的多维度查询场景,分别是:

  • 带多个筛选条件的列表查询
  • 不含分库分表列的其他维度查询

普通的数据库查询,很难实现上述需求场景,更不用提模糊查询、全文检索了。

下面结合楼主的经验和知识,介绍初级方案、进阶方案(上ElasticSearch),大部分情况下推荐使用ElasticSearch来实现多维度查询,赶时间的读者可以直接跳到“进阶方案:将ElasticSearch添加到现有系统中”。

初级方案

1、根据常见查询场景,增加相应字段的组合索引

这个是为了实现带多个筛选条件的列表查询的。

优点

  • 非常简单
  • 读写不一致时间较短:取决于数据库主从同步延时,一般为毫秒级别

缺点

  • 非常局限:除非筛选条件比较固定,否则难以应付后续新增或修改筛选条件
  • 如果每次来新的筛选查询字段的需求,就新增索引,最终导致索引过于庞大,影响性能

于是就出现了经典的一幕:产品提需求说要支持某个新字段的筛选查询,开发反馈说做不了、或者成本很高,于是不了了之 :)

2、异构出多份数据

更加优雅的方式,是异构出多份数据。
例如,C端按用户维度查询,B端按店铺维度查询,如果还有供应商,按供应商维度查询。一个数据库只能按一种维度来分库。

(1)程序写入多个数据源

优点是:非常简单。

缺点

  • 跨库写存在一致性问题(除非不同维度的表使用公共的分库,事务写入),性能低
  • 不能灵活支持更多其他维度的查询

(2)借助Canal实现数据的自动同步

通过Canal同步数据,异构出多个维度的数据源。详见之前写的这篇文章:架构师必备:巧用Canal实现异步、解耦的架构

优点是:更加优雅,无需改动程序主流程。

缺点

  • 仍然无法解决不断变化的需求,不可能为了支持新维度就异构出一份新数据

进阶方案:将ElasticSearch添加到现有系统中

应用架构

现有系统一般都会用到MySQL数据库,需要引入ES,为系统增强多维度查询的功能。
MySQL继续承担业务的实时读写请求、事务操作,ES承担近实时的多维度查询请求,ES可支撑十万级别q

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
MDX 中的重要概念 使用成员、元组和集 (MDX) MDX 语法元素 标识符 表达式 使用多维数据集表达式和子多维数据集表达式 使用维度表达式 使用成员表达式 使用元组表达式 使用集表达式 使用标量表达式 使用空值 运算符(MDX 语法) 算术运算符 位运算符 比较运算符 串联运算符 集运算符 一元运算符 赋值运算符 函数(MDX 语法) 使用字符串函数 使用数学函数 使用逻辑函数 使用成员函数 使用元组函数 使用集函数 使用维度函数、层次结构函数和级别函数 使用存储过程 (MDX) 注释(MDX 语法) 保留关键字(MDX 语法) MDX 查询基础知识 基本 MDX 查询 EXISTING 关键字 用查询轴和切片器轴限定查询 指定查询轴的内容 指定切片器轴的内容 在简单示例中使用查询轴和切片器轴 在查询中建立多维数据集上下文 在 MDX 中生成子多维数据集 在 MDX 中生成命名集 创建查询作用域的命名集 创建会话作用域的命名集 在 MDX 中生成计算成员 在 MDX 中生成单元计算 创建和使用属性值 操作数据 修改数据 使用变量和参数 MDX 脚本编写基础知识 基本 MDX 脚本 管理作用域和上下文 错误处理 支持的 MDX MDX 语言参考 MDX 语法约定 MDX 语句参考 MDX 脚本编写语句 MDX 数据定义语句 MDX 数据操作语句 MDX 运算符参考 --(注释) -(排除) -(负) -(减) *(叉积) *(乘) /(除) ^(幂) /*...*/(注释) //(注释) :(范围) +(加) +(正) +(字符串串联) +(联合) <(小于) <=(小于或等于) (不等于) =(等于) >(大于) >=(大于或等于) AND IS NOT OR XOR MDX 函数参考 AddCalculatedMembers Aggregate AllMembers Ancestor Ancestors Ascendants Avg Axis BottomCount BottomPercent BottomSum CalculationCurrentPass CalculationPassValue Children ClosingPeriod CoalesceEmpty Correlation Count(维度) Count(层次结构级别) Count(集) Count(元组) Cousin Covariance CovarianceN Crossjoin Current CurrentMember CurrentOrdinal CustomData DataMember DefaultMember Descendants Dimension Dimensions Distinct DistinctCount DrilldownLevel DrilldownLevelBottom DrilldownLevelTop DrilldownMember DrilldownMemberBottom DrilldownMemberTop DrillupLevel DrillupMember Error Except Exists Extract Filter FirstChild FirstSibling Generate Head Hierarchize Hierarchy IIf Intersect IsAncestor IsEmpty IsGeneration IsLeaf IsSibling Item(成员) Item(元组) KPIGoal KPIStatus KPITrend KPIWeight KPICurrentTimeMember KPIValue Lag LastChild LastPeriods LastSibling Lead Leaves Level Levels LinkMember LinRegIntercept LinRegPoint LinRegR2 LinRegSlope LinRegVariance LookupCube Max MeasureGroupMeasures Median Members(集) Members(字符串) MemberToStr MemberValue Min Mtd Name NameToSet NextMember NonEmpty NonEmptyCrossjoin OpeningPeriod Order Ordinal ParallelPeriod Parent PeriodsToDate Predict PrevMember Properties Qtd Rank RollupChildren Root SetToArray SetToStr Sib

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值