在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

PolarDB-MySQL引擎層的索引前綴壓縮能力的技術實現和效果

數據庫和存儲 ? 來源:數據庫和存儲 ? 2024-11-09 09:34 ? 次閱讀

在 PolarDB 中, 通過輕量級壓縮的實現, 可以實現減少數據大小的同時, 性能有一定程度的提升. 如何實現的呢?

背景

近幾年互聯網行業的降本增效浪潮愈演愈烈, 如數據壓縮、分級存儲等技術成為了數據庫產品(在技術層面上)實現降本的核心手段。作為一款云原生數據庫,PolarDB 會面向大量行業、場景、需求不同的云用戶,同樣有必要且已經支持了這些能力。PolarDB 在全鏈路多個層級上實現了并正逐步商業化數據壓縮能力, 如整形、字符串、BLOB 等數據格式類型的壓縮,數據列字典壓縮、二級索引前綴壓縮,存儲層的數據塊軟/硬件壓縮等。

首先要提到的必然是 MySQL 官方原生的兩種壓縮能力:表壓縮和透明頁壓縮。這兩種壓縮能力由于或這或那的各種原因,在實際線上業務中并沒有被廣泛仍可和使用。例如前者在 Buffer pool 中存在兩個版本數據且有較為復雜的融合邏輯,后者需要文件系統支持 punch hole 只能對帶寬壓縮而沒有優化 IOPS,兩者只采用限定的相對開銷較高的通用塊壓縮算法等。它們的實測表現也導致傳統 MySQL 用戶在印象里常覺得壓縮會犧牲不少性能并帶來較多復雜度。

事實上,在通用塊壓縮的基礎上,如果可以引入更細致的輕量級壓縮, 甚至在壓縮后的數據上直接進行計算, 那么可以在實現數據壓縮的同時又保證甚至提升性能。并且,在計存分離架構下,遠程 I/O 時延更長,如果可以通過壓縮減少數據大小, 從而減少 I/O, 壓縮帶來的收益相比于本地盤就更加明顯。

由 MySQL 向外擴展來看,針對:(1)動態(update-in-place)或靜態(append-only)數據;(2)行存或列存組織組織(數據同質性不同);(3)有序鏈或無序堆組織的數據(數據局部性不同)等不同情況,能適用的壓縮方法也是不同的,并且壓縮能獲得的效果會有很大差異。因此,對于 PolarDB-MySQL 來說,除了官方的兩種原生壓縮能力,通過輕量級壓縮方法實現頁內/行級壓縮(這也是 Oracle、SQL Server、DB2 等企業級數據庫的標準能力),也是重要發展路徑。

PolarDB 前綴壓縮

本文就主要介紹 PolarDB-MySQL 引擎層的索引前綴壓縮能力(Index Prefix Compression)的技術實現和效果。

通過建立索引結構可以提升數據檢索的性能,代價是額外的寫放大和維護索引結構的存儲空間。OLTP 中為了支持多種訪問路徑,比較常見的情況是在一個表上建立非常多的索引,這就導致索引在數據庫整體存儲空間中占了很大比例。索引存儲占到 50% 以上的實例并不少見,這些實例通常在單表會有幾十個二級索引。

由于索引的 key 部分數據存在有序性,因此對索引 key 部分進行前綴壓縮往往可以取得不錯的壓縮效果。如果用戶的數據表中存在較多的索引(如一些做sass的用戶),索引數據量相對整體數據量的占比不低,此時前綴壓縮的收益其實十分可觀。

我們先簡單了解一下 InnoDB 的索引結構,對于主鍵 record,首先是所有主鍵 key 的字段列、再是非 key 數據的字段列;而二級索引 record,則先是對應二級索引 key 的字段列、再是主鍵 key 的字段列。

值得一提的是,部分商業數據庫在實現 non-unique index 時,一般會將相同的二級索引對應的主鍵索引聚集存放, 這樣二級索引 key 部分的數據只需要存一份(Duplicate Key Removal)。而在 InnoDB 中的實現較為簡單, 每個二級索引 record 為重復的二級索引 key 字段加不同主鍵 key,這加劇了 InnoDB 索引數據膨脹的問題。

b12382f6-903f-11ef-a511-92fbcf53809c.png

前綴壓縮設計原理

前綴壓縮其實有多種具體實現,比如同個 Page 的 record 前綴重復出現部分的直接壓縮,如前綴為 "aaaaa" 直接壓縮為 "a5";或相對前一記錄重復部分的壓縮,又或相對具體元素的前綴重復部分,提取 "aaaaa" 到公共區域作為前綴。

我們采用的方法是將 record 分為兩個部分:前綴部分在多個 record 之間共享,因此可以只存儲一份,從而實現數據壓縮;后綴部分由每個 record 單獨存儲。因此壓縮后的 record 中只存儲了前綴部分的指針 + 后綴部分的數據。

對數據頁內的 record 進行前綴壓縮效果:

b16584e4-903f-11ef-a511-92fbcf53809c.png

采用前綴壓縮,可以有效減少 btree 索引的節點數量:

b1a6e0d8-903f-11ef-a511-92fbcf53809c.png

壓縮元數據的設計

對于InnoDB索引這樣有序的數據鏈,可以依賴前面的記錄作為前綴壓縮的 prefix base,也可以將 prefix base 額外存儲下來。但由于 InnoDB index 的 update-in-place 導致 record 是動態的,所以前者為動態 prefix base,而后者一般設計為(半)靜態 prefix base。對于前者,在 base record 變遷情況下,由于依賴的壓縮 record 可能膨脹,可能會進一步導致原來 optimistic 操作變成 pessimistic 的,引起明顯性能下降,并加劇代碼復雜性導致風險。因此,PolarDB 這里采用的是半靜態 prefix base 設計。

PolarDB 在 page 內部新建 symbol table 存放壓縮所需要的元信息,根據壓縮算法的不同,元信息可以是字典信息、前綴信息等等。

symbol table 放在 page 中,可以實現 page 自解析,避免讀取時額外的 IO,并且解壓 record 是開銷非常小的純內存操作。

symbol table 的物理位置在 system record 之后 user record 之前,也就是 page heap 的起始位置。一旦某個版本的 symbol table 確定之后,除非發生完整的 symbol table 更新,其內容是不會進行修改的,因此我們稱之為半靜態的。symbol table 內部有版本信息、元數據信息和元數據索引信息等等內容,用來實現 record 的快速壓縮和解壓。

數據的壓縮

以 insert 為例,當經過事務處理、記錄構建、索引定位等等操作后,最終會走到 btree 操作的底層函數中。這里會將獲取的 dtuple_t 轉換成 rec_t 選定(樂觀/悲觀)模式后插入數據,這時候應該要考慮壓縮邏輯了。我們此時已經拿了所需的 page 鎖,因此可以保證 page 內相關信息的獨占性,所有需要 page 中壓縮輔助信息內容的行壓縮可以在這一步實現。在這一過程中進行壓縮使得 rec_t 中的數據為壓縮數據,同時需要在 rec_t 保留相關的元信息。

對于前綴壓縮,我們采取壓縮的時機是 lazy 的,即新插入的 record 在 page 上保持非壓縮狀態,等到 page 容量觸發閾值時,再對 page 整體進行壓縮,這樣保證壓縮開銷被均攤到多次 DML 操作上,而不會每次操作都有壓縮開銷。

而觸發 encode 閾值是在 optimistic 路徑的 page 滿且判斷 reorganize 也無法騰出空間時觸發。原本會放鎖進入 SMO 流程,我們這里先嘗試 page 級別整體的encode。

不在 SMO 時做壓縮是因為其持有 index latch 和多個 page latch,對并發操作的影響范圍太大,其次 page 內部的壓縮不需要依賴其他信息。page 級別的壓縮會嘗試對所有記錄進行最優化選取前綴壓縮元信息,并判斷對應生成的新 symbol table 是否會有足夠收益,有則壓縮數據并更新。

我們在 record 的 Info bits 上拓展了一個 bit 來表征此記錄是否是壓縮格式,老版本記錄對應標志不會被設置從而完全兼容原有操作路徑。在一個 page 頁內可以同時存在壓縮和非壓縮兩種類型的記錄,根據對應標志位判斷處理模式。

數據的解壓

首先需要保證在所有 record 使用路徑上,解壓邏輯能夠全面覆蓋,讓用戶拿到原始記錄。其次,InnoDB 內部也存在 dtuple_t(內存記錄格式)和 rec_t(頁上物理記錄格式)兩種 record 格式類型的轉換與比較。當數據前綴壓縮后可能失去列屬性,因此 rec_get_offsets 等函數無法對壓縮后的 rec_t 直接解析,需要對應的改造相應函數獲取 rec_t 中的物理數據偏移。另外,InnoDB 記錄的比較是基于列的,offsets 本質是輔助解析 rec_t 至各列的結構,只要保證相應信息能將壓縮部分數據也能解析出來,就可以用壓縮 rec_t、壓縮元信息以及對應的 offsets,去和 dtuple_t 轉換或比較。總的來說,對于壓縮的 record,要么先完全解壓構建原來的 rec_t 數據走原來比較邏輯,要么用改造過的 offsets 或 dtuple_t 以及對應的列比較執行函數來做比較(可解釋壓縮計算)。PolarDB 目前在不同路徑上會根據環境條件從兩種方式中選擇之一。

前綴壓縮的典型應用

對于如 SaaS/電商場景等一些用戶,其數據表中存在較多的索引可以通過前綴壓縮的降低存儲成本。并且我們和客戶了解到很多情況下, 表數據中有大量的冗余重復數據, 雖然單表中總共有 1 億行, 但是某一行, 比如是品類只有 200 種左右, 這種是最常見的場景.

這種場景在 sysbench-toolkit 里面是 saas_multi_index 場景: https://github.com/baotiao/sysbench-toolkit

從下面的測試數據可以看到, 在 Saas/電商等典型場景里面, 前綴壓縮可以在獲得比較高的壓縮率同時提升整體讀寫性能。

IO Bound 場景

表結構如下

CREATE TABLE `prefix_off_saas_log_10w%d` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `saas_type` varchar(64) DEFAULT NULL,
  `saas_currency_code` varchar(3) DEFAULT NULL,
  `saas_amount` bigint(20) DEFAULT '0',
  `saas_direction` varchar(2) DEFAULT 'NA',
  `saas_status` varchar(64) DEFAULT NULL,
  `ewallet_ref` varchar(64) DEFAULT NULL,
  `merchant_ref` varchar(64) DEFAULT NULL,
  `third_party_ref` varchar(64) DEFAULT NULL,
  `created_date_time` datetime DEFAULT NULL,
  `updated_date_time` datetime DEFAULT NULL,
  `version` int(11) DEFAULT NULL,
  `saas_date_time` datetime DEFAULT NULL,
  `original_saas_ref` varchar(64) DEFAULT NULL,
  `source_of_fund` varchar(64) DEFAULT NULL,
  `external_saas_type` varchar(64) DEFAULT NULL,
  `user_id` varchar(64) DEFAULT NULL,
  `merchant_id` varchar(64) DEFAULT NULL,
  `merchant_id_ext` varchar(64) DEFAULT NULL,
  `mfg_no` varchar(64) DEFAULT NULL,
  `rfid_tag_no` varchar(64) DEFAULT NULL,
  `admin_fee` bigint(20) DEFAULT NULL,
  `ppu_type` varchar(64) DEFAULT NULL,
  PRIMARY KEY (`id`),
  KEY `saas_log_idx01` (`user_id`) USING BTREE,
  KEY `saas_log_idx02` (`saas_type`) USING BTREE,
  KEY `saas_log_idx03` (`saas_status`) USING BTREE,
  KEY `saas_log_idx04` (`merchant_ref`) USING BTREE,
  KEY `saas_log_idx05` (`third_party_ref`) USING BTREE,
  KEY `saas_log_idx08` (`mfg_no`) USING BTREE,
  KEY `saas_log_idx09` (`rfid_tag_no`) USING BTREE,
  KEY `saas_log_idx10` (`merchant_id`)
  ) ENGINE=InnoDB AUTO_INCREMENT=0 DEFAULT CHARSET=utf8

IO Bound 場景隨機讀,采用隨機 point read,128線程,4G Buffer Pool,二級索引大小 20G,壓縮后 3.5G。測得壓縮后 QPS 是 49w,非壓縮是 26w,壓縮是非壓縮的 1.88 倍。

可以看到再開啟了壓縮之后, 性能并沒有下降, 而是有一定程度的提升, 原因如下:

壓縮可以減少btree葉子節點的數量,在 IO bound 場景增加了 buffer pool 對葉子節點的覆蓋率,覆蓋更多的 page 意味著隨機讀場景更少的 page 換入換出,對 bp 的 hash table 和 lru list 訪問頻率更小,hash 鎖和 lru list 鎖競爭更少,此外,對文件系統的 IO 次數更少,用戶線程直接命中 BP 即可返回。

CPU Bound 場景

CPU Bound 場景隨機寫(index鎖沖突),256 線程,100G Buffer Pool 足夠大,單表,一個二級索引,為了效果更加明顯,將二級索引的行長設置為 500,insert 場景,測得壓縮 10w QPS,非壓縮 8w QPS,壓縮是非壓縮的 1.25 倍。

page 中 record 密度更大,減少了 page 分裂頻率,緩解了分裂對 index SX 鎖的爭搶,而且減少了正在分裂節點的父節點拿的 X 鎖數量,緩解了對其葉子節點的插入。此外,為了減少開啟壓縮后 SMO 時拿 index 鎖時間,壓縮路徑不覆蓋 SMO 過程。

CPU Bound場景隨機讀,壓縮和非壓縮性能差不多。

在 bp 足夠大時進行隨機讀取,那么壓縮并不會帶來性能提升,但訪問壓縮 record 會帶來一定解壓開銷,但解壓開銷很小(內存的隨機訪問),因此讀取性能差不多。

壓縮率

還有一個比較關心的問題就是壓縮效率,目前每個 page 有 symbol table,記錄了公共前綴,且一個 record 壓縮到最后是有一部分元數據的。所以并不是 record 越大,壓縮率就一定會更好的。假設公共前綴部分基本占據了整個 record,那么經過演算得到壓縮率隨 record size 的變化曲線是拋物線,由于默認 row 格式時 dynamic,其index key長度限制是 3072Bytes,相當于 1024 個 utf8 字符,這個值小于壓縮率取到極值的點。

測試結果:

測試二級索引大小對壓縮率的影響,探討壓縮的極限壓縮率。單線程順序insert 400w~800w條數據,datasize不超過128的插入800w行,datasize大于128的插入400w行。采用最大的重復率,即每個page里面只有幾種rec。data size是二級索引字段的大小,單位是utf8字符,data size為32相當于96Bytes,其未壓縮的索引大小是壓縮的2.92倍。注意,不同灌數據方式會導致不同的壓縮率,這里測的是單線程隨機插入,壓縮效率優于多線程并發插入,因為并發插入可能導致不必要的page分裂。

data size 32 64 128 256 512
壓縮率 2.92 5.04 8.28 15.11 27.36

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 壓縮
    +關注

    關注

    2

    文章

    102

    瀏覽量

    19377
  • MySQL
    +關注

    關注

    1

    文章

    809

    瀏覽量

    26564

原文標題:PolarDB 索引前綴壓縮

文章出處:【微信號:inf_storage,微信公眾號:數據庫和存儲】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    阿里國際推出全球首個B2B AI搜索引擎Accio

    近日,在歐洲科技峰會Web Summit上,阿里國際正式推出了全球首個B2B領域的AI搜索引擎——Accio。這一創新產品面向全球商家開放,標志著阿里國際正式入局當前備受矚目的AI Search賽道。
    的頭像 發表于 11-15 16:53 ?700次閱讀

    Meta開發新搜索引擎,減少對谷歌和必應的依賴

    近日,Meta正在積極進軍人工智能領域,并試圖跟上OpenAI的發展步伐。為實現這一目標,Meta正在開發一款全新的搜索引擎,該搜索引擎具備網絡爬蟲功能,能夠為用戶提供有關時事的對話答案,而這些答案
    的頭像 發表于 10-29 11:49 ?384次閱讀

    云容器引擎屬于saas服務嗎?二者是什么關系

    云容器引擎屬于SaaS服務,云容器引擎通常被視為一種平臺即服務(PaaS)的變體或擴展,雖然它提供了應用程序的托管環境,但更側重于容器化應用的部署與管理,不完全等同于傳統的軟件即服務(SaaS),但可在SaaS應用的開發和部署
    的頭像 發表于 10-12 10:57 ?220次閱讀

    月訪問量超2億,增速113%!360AI搜索成為全球增速最快的AI搜索引擎

    與傳統搜索引擎不同,作為AI原生搜索引擎的360AI搜索基于公開網絡、知識庫、大模型三大支柱。借助首創的 CoE 技術架構,360AI搜索整合了國內主流的16家廠商51款大模型,支持用戶自選切換
    的頭像 發表于 09-09 13:44 ?477次閱讀
    月訪問量超2億,增速113%!360AI搜索成為全球增速最快的AI搜<b class='flag-5'>索引擎</b>

    OpenAI推出SearchGPT原型,正式向Google搜索引擎發起挑戰

    在人工智能領域的持續探索中,OpenAI 邁出了重大一步,發布了其最新的 SearchGPT 原型,直接瞄準了 Google 的核心業務——搜索引擎。這一舉動不僅標志著 OpenAI 在技術上的又一次飛躍,也預示著搜索引擎市場即
    的頭像 發表于 07-26 15:11 ?580次閱讀

    微軟計劃在搜索引擎Bing中引入AI摘要功能

    近期,科技界傳來新動向,微軟緊隨百度與谷歌的步伐,宣布計劃在其搜索引擎Bing中引入先進的AI摘要功能,旨在為用戶帶來更加智能、豐富的搜索體驗。
    的頭像 發表于 07-26 14:23 ?468次閱讀

    一文了解MySQL索引機制

    的呢?一起靜下心來,耐心看完這篇文章吧,干貨不啰嗦,相信你一定會有所收獲。 一、索引模型 模型也就是數據結構,常見的三種模型分別是哈希表、有序數組和搜索樹。 了解MySQL的朋友已經知道,現在MySQL默認使用的是InnoDB存
    的頭像 發表于 07-25 14:05 ?295次閱讀
    一文了解<b class='flag-5'>MySQL</b><b class='flag-5'>索引</b>機制

    新火種AI|谷歌推出AI搜索引擎惹得出版商擔憂!新聞流量的至暗時刻要來了嗎?

    作者:小巖 編輯:彩云 在數字化浪潮的推動下,AI技術正逐漸滲透到我們生活的方方面面。最近,谷歌宣布推出一款全新的AI搜索引擎,這在使我們見識到了科技巨頭所擁有的超能力和“鈔”能力的同
    的頭像 發表于 05-17 09:40 ?354次閱讀
    新火種AI|谷歌推出AI搜<b class='flag-5'>索引擎</b>惹得出版商擔憂!新聞流量的至暗時刻要來了嗎?

    OpenAI注冊新域名,準備推出結合AI技術的搜索引擎挑戰谷歌

    OpenAI最近注冊了“search.chatgpt.com”域名,看起來是要推出一款新的搜索引擎
    的頭像 發表于 05-08 10:41 ?461次閱讀

    OpenAI或將推出ChatGPT搜索引擎

    據可靠消息透露,OpenAI正秘密研發一款以ChatGPT為基礎的大型產品,其核心功能將是一款新型搜索引擎,旨在為用戶提供更便捷的上網體驗。
    的頭像 發表于 05-08 10:19 ?502次閱讀

    MySQL的整體邏輯架構

    支持多種存儲引擎是眾所周知的MySQL特性,也是MySQL架構的關鍵優勢之一。如果能夠理解MySQL Server與存儲引擎之間是怎樣通過A
    的頭像 發表于 04-30 11:14 ?453次閱讀
    <b class='flag-5'>MySQL</b>的整體邏輯架構

    【RTC程序設計:實時音視頻權威指南】音視頻的編解碼壓縮技術

    。 圖像壓縮技術是通過減少圖像數據的存儲空間來實現圖像壓縮的過程,早期主要依賴于無損壓縮算法,而現代的
    發表于 04-28 21:04

    Redis官方搜索引擎來了,性能炸裂!

    RediSearch 是一個 Redis 模塊,為 Redis 提供查詢、二級索引和全文搜索功能。
    的頭像 發表于 02-21 10:01 ?2356次閱讀
    Redis官方搜<b class='flag-5'>索引擎</b>來了,性能炸裂!

    生成式AI恐使搜索引擎衰退,預計2026年搜索量將下滑25%

    據市場分析機構Gartner報道,生成式AI對傳統搜索引擎構成重大威脅,預計至2026年搜索量將降低25%。為此,企業需調整營銷策略。
    的頭像 發表于 02-20 10:04 ?705次閱讀

    谷歌搜索引擎優化的各個方面和步驟

    谷歌搜索引擎是最受歡迎和廣泛使用的搜索引擎之一,為了使你的網站在谷歌上更好地排名并提高曝光度,你可以采取一些谷歌搜索引擎優化的步驟。 使用關鍵字研究工具,如Google AdWords關鍵字規劃工具
    的頭像 發表于 01-25 10:29 ?888次閱讀
    主站蜘蛛池模板: 夜色321看片资源站| 在线视频 一区二区| 性夜影院爽黄a爽免费视| 性欧美护士18xxxxhd| 久青草久青草高清在线播放| 天天射夜夜操| 888午夜不卡理论久久| 四虎国产精品影库永久免费| 国产福利不卡一区二区三区| 国产69精品久久| 一区二区三区四区精品| 精品成人网| 福利99| 婷婷色天使在线视频观看| 国产gaysexchina男同men1068| 国产综合在线视频| 亚洲国产成人精彩精品| 成人a毛片在线看免费全部播放| www.在线视频| 四虎成人免费观看在线网址| 夜夜夜夜夜夜夜猛噜噜噜噜噜噜| 国产黄视频网站| 日本番囗| 欧洲成人r片在线观看| 一区二区三区四区精品| 国产caob| 亚洲第一页国产| 久久香蕉国产线看观看精品yw| 国产毛片精品| 四虎在线网址| 天天宗合网| 曰本福利写真片视频在线| 成人网视频免费播放| 亚洲一区二区三区影院| 免费观看黄色在线视频| aa在线观看| 女人夜夜春| 97精品久久天干天天蜜| 人人澡人人草| 国产理论视频| 青草青视频在线观看|