iis服务器助手广告
返回顶部
首页 > 资讯 > 数据库 >Cobar提出的一种在分库场景下对Order By / Limit 的优化
  • 408
分享到

Cobar提出的一种在分库场景下对Order By / Limit 的优化

Cobar提出的一种在分库场景下对OrderBy/Limit的优化 2017-05-06 02:05:56 408人浏览 无得
摘要

搜索关注微信公众号"捉虫大师",后端技术分享,架构设计、性能优化、源码阅读、问题排查、踩坑实践。 本文已收录 https://GitHub.com/lkxiaolou/lkxiaolou 欢迎star。 Cobar 虽然是一款“古老”

Cobar提出的一种在分库场景下对Order By / Limit 的优化

搜索关注微信公众号"捉虫大师",后端技术分享,架构设计性能优化源码阅读、问题排查、踩坑实践。
本文已收录 https://GitHub.com/lkxiaolou/lkxiaolou 欢迎star。

Cobar 虽然是一款“古老”的数据库中间件,但目前不少公司仍然在用它,且它包含了不少有意思的算法和实现,今天就来分享 Cobar 提出的一种在分库场景下对 Order By / Limit 的优化

原算法描述参考: Https://github.com/alibaba/cobar/blob/master/doc/cobarSolution.ppt

背景

Cobar 最重要的功能就是分库分表,通常读取性能瓶颈可以通过增加从库或缓存来解决。

但写入性能在 Mysql 上只能通过分库分表来提升。

当我们把数据分布到不同的数据库上时,再查询时如果是单条数据只要找到这条数据对应的库即可,但如果是多条数据,可能分布在不同的库上时,Cobar 就需要先查询,再聚合。
image

来个具体例子:

image

如果我们要查询 tb1 表的 c1 字段,且取 c1 正序的下标(从0开始)为4、5的数据。假设分了三个库,我们为了取到正确数据,需要去这三个分库都取下标0-5的数据,假设取到如下数据:

image

取到3堆已排序的数据,对这3堆数据从小开始丢弃0、1、2、3号数据,保留第4、5号数据即是我们需要的。

image

这个算法看起来没啥问题,但如果数据量稍微变化一下,比如:

select c1 from tb1 order by c1 limit 9999999, 4

如果还按照上述的方法来做,首先得去每个分库查询 0 - 10000003的数据,然后再合并丢弃0-9999998号数据。

相当于丢弃了大约不分库时3倍的数据。这多少显得有点浪费了。

算法优化

  • Step1:将这条语句拆分成3条语句发给3个分库:

image

  • Step2:找出查询结果的最大和最小值,这里假设最小值为3,最大值为11

image

  • Step3:以最小值和最大值为条件再次查询

image

假设我们取得的数据如图,那么我们是不是很容易推断出这些结果之前还有多少数据?

  • Step4:反查出每一个返回结果的 offset,这里我们就能推断出分库1在最小值之前还有3333332条数据,分库2在最小值之前还有3333333条数据,分库3在最小值之前还有3333331条数据

image

这时,我们就可以丢弃合并后的0-9999998号数据了,分库1、2、3将最小值之前的数据都丢弃共丢弃了0-9999995号数据,再丢弃3个最小值3刚好够到了9999998,所以9999999号数据开始依次是4、5、5、6

image

算法分析

效率

以上例来说明,未优化前:

  • 1次查询,查询的数据总量大约 3kw,丢弃9999999条数据

优化后:

  • 第1次查询,查询数据总量约 1kw
  • 第2次查询,数据总量17
  • 丢弃3条数据

从这个例子可以看出,查询的数据量大大减少,需要计算丢弃的量也大大减少

非理想情况

可能大家能看出来,上述例子是非常理想的情况,如果数据没这么“理想”,结局又是怎样?

  • Step4 中反查的最小值之前不够丢弃怎么办,比如:

image

  • Step4 中反查的最小值之前的数据比需要丢弃的数据多怎么办?

image

可以看出,如果是这两种情况,这种算法就没法再次生效了。

优化的前提

根据上述两种情况来看,可以总结出该算法生效的前提是:

数据(排序字段)在各个分库上的分布要均匀

其实可以做个极端的假设,比如只有第一个分库上有数据,其他数据库没有数据,那么这个算法就失效了

总结

这么来看,这个算法是不是很废?确实比较废,就连 Cobar 中也没有使用。

但在某些场景下还是有比较大的提升的,分库的数据大部分时候是按字段进行取模,所以可以认为几乎是分布均匀的,此时如果 Order By / Limit 是比较深度翻页的数据,可以采取此策略,但也要进行兜底,如果返回的数据不满足条件,继续退化为最初的算法,所以单次效率可能不高,但从统计值上来看其效率可能是更高的。


搜索关注微信公众号"捉虫大师",后端技术分享,架构设计、性能优化、源码阅读、问题排查、踩坑实践。

image

您可能感兴趣的文档:

--结束END--

本文标题: Cobar提出的一种在分库场景下对Order By / Limit 的优化

本文链接: https://www.lsjlt.com/news/8831.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 什么是SQL注入如何在SQL Server中防止它
    SQL注入是一种针对数据库的攻击技术,攻击者利用Web应用程序中的漏洞向数据库中插入恶意的SQL查询,以获取对数据库的非法访问权限或篡改数据。在SQL Server中可以通过以下方法来防止SQL注入: 使用参数化查询:参数化查询是一种将...
    99+
    2024-06-04
    sql server
  • 描述SQL Server中的不同备份类型及其用途
    SQL Server中有多种备份类型,每种备份类型都有其特定的用途。以下是一些常见的备份类型及其用途: 完整备份(Full Backup):完整备份是对整个数据库的备份,包括所有数据和日志。这种备份类型是最全面的备份,用于恢复整个数据库...
    99+
    2024-06-04
    sql server
  • 在SQL Server中使用XML数据的最佳实践是什么
    在SQL Server中使用XML数据时,以下是一些最佳实践: 使用XML数据类型:SQL Server提供了XML数据类型,可以存储和操作XML数据。使用XML数据类型可以有效地存储和查询XML数据,同时提高性能和可读性。 使用X...
    99+
    2024-06-04
    sql server
  • 解释SQL Server中的日志文件和数据文件
    SQL Server中的日志文件和数据文件是关系数据库中的两种主要文件类型,用于存储数据库的数据和日志信息。 数据文件包含了实际存储在数据库中的数据,包括表、索引、存储过程等。数据文件通常具有扩展名为.mdf。每个数据库至少有一个数据文件,...
    99+
    2024-06-04
    sql server
  • 描述SQL Server在容器中运行的支持情况和优势
    SQL Server 在容器中运行的支持情况和优势如下: 支持情况: Microsoft 官方已经发布了 SQL Server 的容器镜像,可以直接从 Docker Hub 上拉取使用。 SQL Server 2017 及以上版本支持在 ...
    99+
    2024-06-04
    sql server
  • SQL Server中的镜像和Always On之间有什么区别
    SQL Server中的镜像(Database Mirroring)和Always On是两种提供高可用性和灾难恢复的技术,但它们有一些区别: Mirroring是SQL Server 2005和2012版本中引入的一种技术,主要用于数...
    99+
    2024-06-04
    sql server
  • 解释SQL Server中的Data Virtualization技术及其用途
    Data Virtualization是一种数据集成技术,通过这种技术,用户可以使用SQL查询来访问和操作分布在不同数据源中的数据,而无需复制或移动数据。在SQL Server中,Data Virtualization技术可以通过使用Lin...
    99+
    2024-06-04
    sql server
  • 描述SQL Server中索引碎片的影响以及如何处理它
    索引碎片是指索引中数据的物理存储并非按照逻辑顺序排列,导致数据库性能下降的情况。索引碎片会增加查询的成本,降低数据库的性能。 处理索引碎片的方法包括重新组织索引和重建索引。重新组织索引是通过重新排列索引中的数据来减少碎片,而不会改变索引的定...
    99+
    2024-06-04
    sql server
  • 在SQL Server中什么是故障转移群集实例
    在SQL Server中,故障转移群集实例是一种高可用性解决方案,用于确保数据库实例的持续可用性。故障转移群集实例是一组运行在不同服务器上的SQL Server实例,这些实例共享相同的数据库,并通过Windows故障转移群集服务来监视和管理...
    99+
    2024-06-04
    sql server
  • 如何使用SQL Server的执行计划分析慢查询
    要使用SQL Server的执行计划来分析慢查询,可以按照以下步骤操作: 打开SQL Server Management Studio并连接到您的数据库服务器。 在查询窗口中输入您想要分析的慢查询,并执行该查询。 在查询结果窗口...
    99+
    2024-06-04
    sql server
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作