自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

Cobar提出的一種在分庫(kù)場(chǎng)景下對(duì)Order By / Limit 的優(yōu)化

運(yùn)維 數(shù)據(jù)庫(kù)運(yùn)維
Cobar 雖然是一款“古老”的數(shù)據(jù)庫(kù)中間件,但目前不少公司仍然在用它,且它包含了不少有意思的算法和實(shí)現(xiàn),今天就來(lái)分享 Cobar 提出的一種在分庫(kù)場(chǎng)景下對(duì) Order By / Limit 的優(yōu)化。

[[428269]]

本文轉(zhuǎn)載自微信公眾號(hào)「捉蟲(chóng)大師」,作者捉蟲(chóng)大師。轉(zhuǎn)載本文請(qǐng)聯(lián)系捉蟲(chóng)大師公眾號(hào)。

Cobar 雖然是一款“古老”的數(shù)據(jù)庫(kù)中間件,但目前不少公司仍然在用它,且它包含了不少有意思的算法和實(shí)現(xiàn),今天就來(lái)分享 Cobar 提出的一種在分庫(kù)場(chǎng)景下對(duì) Order By / Limit 的優(yōu)化。

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

背景

Cobar 最重要的功能就是分庫(kù)分表,通常讀取性能瓶頸可以通過(guò)增加從庫(kù)或緩存來(lái)解決。

但寫(xiě)入性能在 MySQL 上只能通過(guò)分庫(kù)分表來(lái)提升。

當(dāng)我們把數(shù)據(jù)分布到不同的數(shù)據(jù)庫(kù)上時(shí),再查詢(xún)時(shí)如果是單條數(shù)據(jù)只要找到這條數(shù)據(jù)對(duì)應(yīng)的庫(kù)即可,但如果是多條數(shù)據(jù),可能分布在不同的庫(kù)上時(shí),Cobar 就需要先查詢(xún),再聚合。圖片

來(lái)個(gè)具體例子:

如果我們要查詢(xún) tb1 表的 c1 字段,且取 c1 正序的下標(biāo)(從0開(kāi)始)為4、5的數(shù)據(jù)。假設(shè)分了三個(gè)庫(kù),我們?yōu)榱巳〉秸_數(shù)據(jù),需要去這三個(gè)分庫(kù)都取下標(biāo)0-5的數(shù)據(jù),假設(shè)取到如下數(shù)據(jù):

取到3堆已排序的數(shù)據(jù),對(duì)這3堆數(shù)據(jù)從小開(kāi)始丟棄0、1、2、3號(hào)數(shù)據(jù),保留第4、5號(hào)數(shù)據(jù)即是我們需要的。

這個(gè)算法看起來(lái)沒(méi)啥問(wèn)題,但如果數(shù)據(jù)量稍微變化一下,比如:

select c1 from tb1 order by c1 limit 9999999, 4

如果還按照上述的方法來(lái)做,首先得去每個(gè)分庫(kù)查詢(xún) 0 - 10000003的數(shù)據(jù),然后再合并丟棄0-9999998號(hào)數(shù)據(jù)。

相當(dāng)于丟棄了大約不分庫(kù)時(shí)3倍的數(shù)據(jù)。這多少顯得有點(diǎn)浪費(fèi)了。

算法優(yōu)化

Step1:將這條語(yǔ)句拆分成3條語(yǔ)句發(fā)給3個(gè)分庫(kù):

  • Step2:找出查詢(xún)結(jié)果的最大和最小值,這里假設(shè)最小值為3,最大值為11

Step3:以最小值和最大值為條件再次查詢(xún)

假設(shè)我們?nèi)〉玫臄?shù)據(jù)如圖,那么我們是不是很容易推斷出這些結(jié)果之前還有多少數(shù)據(jù)?

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

這時(shí),我們就可以丟棄合并后的0-9999998號(hào)數(shù)據(jù)了,分庫(kù)1、2、3將最小值之前的數(shù)據(jù)都丟棄共丟棄了0-9999995號(hào)數(shù)據(jù),再丟棄3個(gè)最小值3剛好夠到了9999998,所以9999999號(hào)數(shù)據(jù)開(kāi)始依次是4、5、5、6

算法分析

效率

以上例來(lái)說(shuō)明,未優(yōu)化前:

  • 1次查詢(xún),查詢(xún)的數(shù)據(jù)總量大約 3kw,丟棄9999999條數(shù)據(jù)

優(yōu)化后:

  • 第1次查詢(xún),查詢(xún)數(shù)據(jù)總量約 1kw
  • 第2次查詢(xún),數(shù)據(jù)總量17
  • 丟棄3條數(shù)據(jù)

從這個(gè)例子可以看出,查詢(xún)的數(shù)據(jù)量大大減少,需要計(jì)算丟棄的量也大大減少

非理想情況

可能大家能看出來(lái),上述例子是非常理想的情況,如果數(shù)據(jù)沒(méi)這么“理想”,結(jié)局又是怎樣?

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

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

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

優(yōu)化的前提

根據(jù)上述兩種情況來(lái)看,可以總結(jié)出該算法生效的前提是:

數(shù)據(jù)(排序字段)在各個(gè)分庫(kù)上的分布要均勻

其實(shí)可以做個(gè)極端的假設(shè),比如只有第一個(gè)分庫(kù)上有數(shù)據(jù),其他數(shù)據(jù)庫(kù)沒(méi)有數(shù)據(jù),那么這個(gè)算法就失效了

總結(jié)

這么來(lái)看,這個(gè)算法是不是很廢?確實(shí)比較廢,就連 Cobar 中也沒(méi)有使用。

 

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

 

責(zé)任編輯:武曉燕 來(lái)源: 捉蟲(chóng)大師
相關(guān)推薦

2020-12-09 10:10:24

MySQL數(shù)據(jù)庫(kù)算法

2023-03-26 20:39:01

2023-05-11 07:30:10

KV存儲(chǔ)GC優(yōu)化

2022-05-13 09:40:51

代碼可行應(yīng)用性能

2016-10-13 10:57:55

phptcp專(zhuān)欄

2022-05-27 17:38:22

CloudOps云運(yùn)維

2020-12-23 10:10:23

Pythonweb代碼

2022-06-22 09:44:41

Python文件代碼

2022-07-07 10:33:27

Python姿勢(shì)代碼

2020-12-09 10:15:34

Pythonweb代碼

2017-02-20 09:00:49

2021-01-13 15:05:24

架構(gòu)線程開(kāi)發(fā)

2017-06-22 16:46:45

2010-05-17 17:09:29

Mysql LIMIT

2013-09-30 10:13:08

IT女程序員

2022-06-06 15:44:24

大數(shù)據(jù)數(shù)據(jù)分析思維模式

2010-08-23 14:25:13

marginCSS

2010-05-21 14:01:23

MySQL數(shù)據(jù)庫(kù)

2017-08-01 18:06:56

2015-01-26 15:58:02

MDM應(yīng)用指南
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)