在云化場(chǎng)景下,還有一個(gè)主要場(chǎng)景對(duì)客戶的體驗(yàn)非常重要 。我們知道客戶的業(yè)務(wù)要遷移上云,需要對(duì)數(shù)據(jù)進(jìn)行大規(guī)模的遷移(華為云提供了數(shù)據(jù)復(fù)制服務(wù)DRS工具支持各類數(shù)據(jù)遷移場(chǎng)景),數(shù)據(jù)遷移比較高效的方式為:
1)邏輯導(dǎo)出源端數(shù)據(jù)
2)在目標(biāo)端建表(注意,表不含二級(jí)索引)
3)將源端導(dǎo)出的數(shù)據(jù)插入到目標(biāo)端
4)對(duì)目標(biāo)端的表建立二級(jí)索引
如果涉及動(dòng)態(tài)數(shù)據(jù)同步,相關(guān)步驟會(huì)更復(fù)雜一些,由于和該主題無關(guān),這里不展開 。以上步驟中,需要重點(diǎn)注意的是步驟2和4,在目標(biāo)端創(chuàng)建表的時(shí)候先不創(chuàng)建二級(jí)索引 。這個(gè)優(yōu)化對(duì)性能影響很大,尤其是一個(gè)表有很多二級(jí)索引的場(chǎng)景 。我們知道Btree索引的插入如果是有序的,對(duì)插入性能和結(jié)果的空間利用率是最好的,因?yàn)锽tree索引的分裂會(huì)在插入?yún)^(qū)域的尾部產(chǎn)生,同時(shí)由于分裂算法的優(yōu)化,分裂產(chǎn)生的頁面填充率會(huì)比較高;相反地,如果是隨機(jī)插入,尤其是并發(fā)地隨機(jī)插入,很容易導(dǎo)致Btree索引在不同的節(jié)點(diǎn)進(jìn)行分裂,并且分裂后的頁面填充率都處于一個(gè)半滿的狀態(tài),導(dǎo)致Btree最終的一個(gè)膨脹 。
有了這個(gè)背景之后,我們就容易理解上面的問題,插入表數(shù)據(jù)的時(shí)候,我們屏蔽了二級(jí)索引,等所有數(shù)據(jù)都準(zhǔn)備好了,再采用批量建立索引的方式創(chuàng)建二級(jí)索引,這對(duì)于二級(jí)索引創(chuàng)建效率是最高的 。如果不這么做,每插入一條記錄,就要去插入相應(yīng)的二級(jí)索引,那么二級(jí)索引就是一個(gè)無序的隨機(jī)插入,并發(fā)起來性能會(huì)變差很多 。
雖然在數(shù)據(jù)同步準(zhǔn)備好后,批量創(chuàng)建二級(jí)索引是一個(gè)有效的方案,但是如果數(shù)據(jù)量很大,這么創(chuàng)建二級(jí)索引還是非常耗時(shí),導(dǎo)致客戶在數(shù)據(jù)遷移完之后需要等待很長時(shí)間才能開展業(yè)務(wù),這個(gè)等待周期可能是小時(shí)甚至天級(jí)別的 。雖然可以考慮表級(jí)別的并發(fā)創(chuàng)建索引,但是這個(gè)方法也有明顯的缺點(diǎn):應(yīng)用場(chǎng)景有限,要求有多表;以及表和表之間的并發(fā)其實(shí)不是一個(gè)最有效的并發(fā)形式,相互影響比較大 。
GaussDB(for MySQL)如何快速創(chuàng)建索引?綜上所述,在創(chuàng)建索引這個(gè)點(diǎn)上存在兩個(gè)性能瓶頸點(diǎn):一個(gè)是用戶遷移數(shù)據(jù)之后的批量索引創(chuàng)建;第二個(gè)是用戶臨時(shí)需要添加一個(gè)二級(jí)索引 。無論哪個(gè)點(diǎn),我們都需要更快的建立好索引,提升用戶的使用體驗(yàn) 。
華為云GaussDB(for MySQL)引入了并行創(chuàng)建索引的技術(shù),它改進(jìn)了社區(qū)版MySQL創(chuàng)建索引只用單線程的問題,以此提高創(chuàng)建索引的效率,并一起解決了前述兩個(gè)痛點(diǎn) 。前面提到的社區(qū)版創(chuàng)建索引邏輯是單線程的,首先存在資源利用率不夠飽滿的問題;其次創(chuàng)建索引過程是CPU和IO開銷交替進(jìn)行的過程,在做一個(gè)操作的時(shí)候,即使不是資源競(jìng)爭(zhēng)的操作也只有等待 。多線程創(chuàng)建索引可以充分利用CPU和IO資源,同時(shí)有的線程在做CPU計(jì)算時(shí),別的線程可以并發(fā)的做IO操作 。
GaussDB(for MySQL)使用的并行創(chuàng)建索引,是一個(gè)全鏈路的并行技術(shù) 。前面提到,創(chuàng)建索引包含了若干個(gè)階段,我們的并行創(chuàng)建算法,對(duì)這里的每個(gè)階段都做并行處理,從讀取數(shù)據(jù)、排序、到創(chuàng)建索引,都是并行操作,每一步都由指定的N個(gè)線程并發(fā)處理 。它的邏輯如下圖所示:

文章插圖
GaussDB(for MySQL)尤其對(duì)數(shù)據(jù)的歸并排序做了多種優(yōu)化,使得我們常規(guī)的歸并排序能夠充分的并行,充分利用CPU、內(nèi)存和IO的資源 。在并行創(chuàng)建索引之后的合并步驟,也使用了一套簡(jiǎn)化的算法,正確處理各種索引結(jié)構(gòu)的場(chǎng)景 。
支持的索引和場(chǎng)景GaussDB(for MySQL)的并行創(chuàng)建索引功能,目前支持的索引為Btree二級(jí)索引 。對(duì)于virtual index二級(jí)索引,將會(huì)在不久的將來提供全面的支持,而MySQL的spatial index和fulltext index不在該并行創(chuàng)建索引覆蓋范圍內(nèi) 。
以上關(guān)于本文的內(nèi)容,僅作參考!溫馨提示:如遇健康、疾病相關(guān)的問題,請(qǐng)您及時(shí)就醫(yī)或請(qǐng)專業(yè)人士給予相關(guān)指導(dǎo)!
「愛刨根生活網(wǎng)」www.malaban59.cn小編還為您精選了以下內(nèi)容,希望對(duì)您有所幫助:- 吃橙子會(huì)引起上火嗎 能增加機(jī)體抵抗力
- 北京五中哪個(gè)區(qū) 北京五中怎么樣?
- 健身 讓你強(qiáng)體加瘦身
- 加班族 健身有好處
- 遠(yuǎn)程查看別人微信聊天記錄 怎么把對(duì)方微信盜了
- 我的婆婆太迷信了 我應(yīng)該怎么辦
- 遇見這樣的婆婆我該怎么辦呢?
- 第一次談戀愛該怎么談?5個(gè)方面必須了解!
- 內(nèi)向的人怎么談戀愛?學(xué)會(huì)四個(gè)技巧
- 男朋友異性緣太好 沒有安全感怎么辦
