分散式資料庫索引能力大調研

qing_yun發表於2024-03-15

索引,是資料庫中非常重要的一類物件。在資料庫中增加索引,是常見的一種最佳化手段,特別是對於查詢語句的最佳化,很多都可以透過增加索引方式來解決。在分散式資料庫情況下,索引又有所不同,其較單機或集中式資料庫在設計、管理、最佳化方面有一定的差異。本文針對國內主流的一些分散式資料庫,針對索引功能做了個小調研,希望對大家能有所幫助。這裡特別感謝來自奧神貝斯、平凱星辰、阿里雲、騰訊雲、金篆信科、萬里開源老師的協助。

1. 索引概述

1).索引優點與缺點

索引作為一種可選的資料結構,可有效提升基於索引欄位的查詢效能,使用者可根據業務自身需求進行選擇。其優點非常明顯,即在不修改SQL語句的前提下可以加速查詢,其原理是因為透過掃描索引減少了對原表的訪問,進而節省了查詢IO,提升效能。但索引也不是什麼“銀彈”,其缺點非常明顯,索引作為一種資料庫的結構,只要佔據儲存空間並會導致資料維護成本的提高。此外,隨著業務調整變化,原索引也需要人工維護。

2).分散式下索引特殊性

在分散式資料庫中,資料是採用分片方式儲存,即表中的資料存在在不同節點上。在索引中需要記錄索引列及對應在原表中的位置,故其使用維護成本是比較高的。而且資料的拆分情況下,資料規模減少了很多,是否還需要透過索引加速訪問也值得商榷。很多單機或集中式資料庫遷移到分散式資料庫時,其對應的索引策略是不建議直接平移過來,需要結合分片設計做單獨考慮。

3).索引使用建議

如何更好地使用索引,有一些通用的建議:

  • 索引建立,應遵循最左字首原則。

  • 儘量選擇基數較高的欄位,所謂索引欄位。

  • 為經常參加過濾、關聯、排序的欄位建立索引。

  • 可以利用覆蓋索引,有效避免回表操作。

針對分散式資料庫中的索引,有些不同的建議:

  • 減少不必要的全域性索引,因為其維護代價很高。

  • 在資料分片下,資料規模進一步縮小,需考慮建立索引的必要性。

2. 索引能力大對比

近些年來,國內湧現出一大批分散式資料庫產品,其架構不同、功能各異。使用者在使用時,面臨一個普遍問題就是選型,作為重要的考察功能之一,索引也是大家非常關注的一點。這裡針對國內的一些主流分散式資料庫在索引功能上的情況,做了個簡單調研。

[1] TiDB中的索引都被認為是全域性索引,故不存在本地索引說法

1).索引型別

這裡談的索引型別,是指索引是否有獨立的資料分佈模式。也就是說,索引是否是按照跟表相同的資料分佈方式,還是自己獨立一套。前者通常被稱為本地索引、區域性索引,後者則被稱為全域性索引、二級索引等。對於本地索引而言,由於其資料分佈與表相同,因此如果想使用使用是需要配合分割槽鍵的,能精確定位到分割槽的場景。對於全域性索引而言,則沒有這個限制,可以按照非分割槽鍵的維度進行查詢。通常全域性索引也是使用在不包含分割槽鍵的多維度查詢場景。當然其付出的代價也很大,每一筆資料都有可能會演化為跨機的分散式事務,對資料庫的吞吐、延時等都會造成影響。這裡可參考下網上一篇評測報告。因此通常建議嚴格區分場景,優先使用本地索引來解決,確實不能解決的再考慮全域性索引,但也要嚴格控制全域性索引的個數。從產品上來看,大部分分散式資料庫產品都支援了全域性索引,這也是為了迎合使用者之前基於單機/集中式資料庫的使用習慣。當然這裡還是強調下,在分散式資料庫中不能一味遷就原有的結構設計,為了獲得效能與效率的平衡,是需要考慮在應用側做些妥協的。這裡需要注意的是 TiDB,因其資料天然具備的自動拆分特點,其索引都可被視為全域性索引。

2).支援表型別

在分散式資料庫中,索引支援在哪些表中建立。很多分散式資料庫支援建立分割槽表(或叫分片表),也支援建立非分割槽表。對應的索引是否支援在不同型別的表上建立。一般情況下,分割槽表上可以建立分割槽索引(可能是全域性的或本地的),非分割槽表沒有建立分割槽索引的意義。從產品來看,大部分產品都支援在不同型別的表上建立索引。TiDB 因其自身技術設計,其表都為分割槽表,因此不涉及這個問題。

3).索引唯一性

唯一索引可以確保表中的某個欄位(或組合)的唯一性。在分散式資料庫中,由於資料分片儲存,確保唯一性是個挺難的事。因此大多數情況下,唯一索引是包含分割槽鍵的組合索引,這樣維護的代價相對較小。從產品上看,上述產品都支援了索引的唯一性。

4).索引列個數

索引欄位可支援一個或多個。從產品上看,上述產品都支援單鍵索引和複合索引。

5).索引有序

索引作為一種有序的資料儲存結構,可以按照資料升序順序儲存,也可以按降序儲存,因此建立的索引就有升序索引和降序索引。在進行資料排序類訪問時(如Order By),可利用索引的有序性來提升訪問效能。當訪問操作需要按照不同於索引排序的方式訪問時(如對索引列降序訪問,但只存在升序索引),有的資料庫是可以利用升序索引來解決,有的則只能退化為表掃描方式解決。例如在MySQL 8.0中就支援“Backward index scan”來解決此問題。從產品來看,部分產品支援降序索引,部分產品還不支援。

6).特殊索引

除了常規的 BTree 索引外,有些資料庫還支援特殊型別的索引,這裡舉例如空間索引和函式索引。前者是一種用於加速空間資料的查詢的特殊索引型別,主要應用於地理資訊系統(GIS)和空間資料處理領域;後者則是支援對函式或者表示式做索引。這些能力無疑會擴充套件索引的使用範圍。從產品上看,廠商能力參差不齊,特別是針對空間索引。

7).其他能力

索引的其他能力,這裡列舉了幾種常見的。一是索引提示,針對複雜資料訪問場景或最佳化器尚不穩定時,提示是一種有效的應急/規避手段。上述產品也都支援了此功能。索引合併,是指 Index Merge 功能,大部分產品已經支援,少數產品還不行。索引可見性則是指最佳化器是否忽略該索引,這對於索引維護、系統最佳化有一定幫助,上述產品也都支援了。最後則是索引強一致,這也是對索引的最基本要求,也是資料庫與中介軟體產品的差異,上述產品也都支援。

來自 “ 韓鋒頻道 ”, 原文作者:韓鋒頻道;原文連結:https://mp.weixin.qq.com/s/NVqZ-Y09HoSEIsYvzEgFBQ,如有侵權,請聯絡管理員刪除。

相關文章