成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Cobar提出的一種在分庫場景下對Order By / Limit 的優化

運維 數據庫運維
Cobar 雖然是一款“古老”的數據庫中間件,但目前不少公司仍然在用它,且它包含了不少有意思的算法和實現,今天就來分享 Cobar 提出的一種在分庫場景下對 Order By / Limit 的優化。

[[428269]]

本文轉載自微信公眾號「捉蟲大師」,作者捉蟲大師。轉載本文請聯系捉蟲大師公眾號。

Cobar 雖然是一款“古老”的數據庫中間件,但目前不少公司仍然在用它,且它包含了不少有意思的算法和實現,今天就來分享 Cobar 提出的一種在分庫場景下對 Order By / Limit 的優化。

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

背景

Cobar 最重要的功能就是分庫分表,通常讀取性能瓶頸可以通過增加從庫或緩存來解決。

但寫入性能在 MySQL 上只能通過分庫分表來提升。

當我們把數據分布到不同的數據庫上時,再查詢時如果是單條數據只要找到這條數據對應的庫即可,但如果是多條數據,可能分布在不同的庫上時,Cobar 就需要先查詢,再聚合。圖片

來個具體例子:

如果我們要查詢 tb1 表的 c1 字段,且取 c1 正序的下標(從0開始)為4、5的數據。假設分了三個庫,我們為了取到正確數據,需要去這三個分庫都取下標0-5的數據,假設取到如下數據:

取到3堆已排序的數據,對這3堆數據從小開始丟棄0、1、2、3號數據,保留第4、5號數據即是我們需要的。

這個算法看起來沒啥問題,但如果數據量稍微變化一下,比如:

select c1 from tb1 order by c1 limit 9999999, 4

如果還按照上述的方法來做,首先得去每個分庫查詢 0 - 10000003的數據,然后再合并丟棄0-9999998號數據。

相當于丟棄了大約不分庫時3倍的數據。這多少顯得有點浪費了。

算法優化

Step1:將這條語句拆分成3條語句發給3個分庫:

  • Step2:找出查詢結果的最大和最小值,這里假設最小值為3,最大值為11

Step3:以最小值和最大值為條件再次查詢

假設我們取得的數據如圖,那么我們是不是很容易推斷出這些結果之前還有多少數據?

  • Step4:反查出每一個返回結果的 offset,這里我們就能推斷出分庫1在最小值之前還有3333332條數據,分庫2在最小值之前還有3333333條數據,分庫3在最小值之前還有3333331條數據

這時,我們就可以丟棄合并后的0-9999998號數據了,分庫1、2、3將最小值之前的數據都丟棄共丟棄了0-9999995號數據,再丟棄3個最小值3剛好夠到了9999998,所以9999999號數據開始依次是4、5、5、6

算法分析

效率

以上例來說明,未優化前:

  • 1次查詢,查詢的數據總量大約 3kw,丟棄9999999條數據

優化后:

  • 第1次查詢,查詢數據總量約 1kw
  • 第2次查詢,數據總量17
  • 丟棄3條數據

從這個例子可以看出,查詢的數據量大大減少,需要計算丟棄的量也大大減少

非理想情況

可能大家能看出來,上述例子是非常理想的情況,如果數據沒這么“理想”,結局又是怎樣?

  • Step4 中反查的最小值之前不夠丟棄怎么辦,比如:

  • Step4 中反查的最小值之前的數據比需要丟棄的數據多怎么辦?

可以看出,如果是這兩種情況,這種算法就沒法再次生效了。

優化的前提

根據上述兩種情況來看,可以總結出該算法生效的前提是:

數據(排序字段)在各個分庫上的分布要均勻

其實可以做個極端的假設,比如只有第一個分庫上有數據,其他數據庫沒有數據,那么這個算法就失效了

總結

這么來看,這個算法是不是很廢?確實比較廢,就連 Cobar 中也沒有使用。

 

但在某些場景下還是有比較大的提升的,分庫的數據大部分時候是按字段進行取模,所以可以認為幾乎是分布均勻的,此時如果 Order By / Limit 是比較深度翻頁的數據,可以采取此策略,但也要進行兜底,如果返回的數據不滿足條件,繼續退化為最初的算法,所以單次效率可能不高,但從統計值上來看其效率可能是更高的。

 

責任編輯:武曉燕 來源: 捉蟲大師
相關推薦

2023-03-26 20:39:01

2020-12-09 10:10:24

MySQL數據庫算法

2023-05-11 07:30:10

KV存儲GC優化

2022-05-13 09:40:51

代碼可行應用性能

2022-05-27 17:38:22

CloudOps云運維

2020-12-09 10:15:34

Pythonweb代碼

2016-10-13 10:57:55

phptcp專欄

2020-12-23 10:10:23

Pythonweb代碼

2022-07-07 10:33:27

Python姿勢代碼

2022-06-22 09:44:41

Python文件代碼

2017-02-20 09:00:49

2021-01-13 15:05:24

架構線程開發

2017-06-22 16:46:45

2013-09-30 10:13:08

IT女程序員

2010-05-17 17:09:29

Mysql LIMIT

2022-06-06 15:44:24

大數據數據分析思維模式

2010-08-23 14:25:13

marginCSS

2015-01-26 15:58:02

MDM應用指南

2017-08-01 18:06:56

2010-05-21 14:01:23

MySQL數據庫
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 午夜在线视频一区二区三区 | caoporn国产精品免费公开 | 91精品久久久久久久久久入口 | 日韩中文字幕在线免费 | 福利影院在线看 | jdav视频在线观看免费 | 亚洲久草视频 | 日韩国产欧美视频 | 日本三级网站在线观看 | av网站在线播放 | 亚洲电影一区二区三区 | 久久精品国产亚洲一区二区三区 | 日韩中文字幕一区 | 黄色一级大片在线免费看产 | 久久国产日本 | 国产精品99999| 一级午夜aaa免费看三区 | 国产一区不卡 | 欧美aaa级 | 亚洲一区二区三区四区五区中文 | 网黄在线| 欧美视频一级 | 天天噜天天干 | 日韩网站在线 | 欧美午夜在线 | 欧美精品一区二区三区四区五区 | 亚洲精品一区二区三区 | 亚洲av毛片| 大香网伊人| 欧美精品久久久 | 亚洲精品乱码久久久久久久久久 | 亚洲a在线观看 | 久久国产精品-国产精品 | 日韩中文在线 | 国产极品车模吞精高潮呻吟 | 亚洲视频精品 | 国产精品片 | 免费观看一级毛片 | 亚洲天天干 | 国产成人精品一区二区 | 精品一区二区久久久久久久网精 |