Index 和 Type 的區別

2022-07-16 22:03:22 字數 1431 閱讀 9836

原文: index vs. type by adrien grand

譯者: fengchang

對於 es 的新使用者來說,有乙個常見的問題:要儲存一批新的資料時,應該在已有 index 裡新建乙個 type,還是給它新建乙個 index?要想回答這個問題,我們必須先理解這兩者是怎麼實現的。

過去,我們為了讓 es 更容易理解,經常用關係型資料庫做乙個比喻: index 就像關係型資料庫裡的 database, type 就像

database 裡的 table。但是這並不正確。由於兩種資料庫儲存資料的方式是如此不同,任何比喻都是沒有意義的。這種比喻往往會導致對

type 的濫用。

index 儲存在多個分片中,其中每乙個分片都是乙個獨立的 lucene index。這就應該能提醒你,新增新 index

應該有個限度:每個 lucene index 都需要消耗一些磁碟,記憶體和檔案描述符。因此,乙個大的 index 比多個小 index

另乙個重要因素是你準備怎麼搜尋你的資料。在搜尋時,每個分片都需要搜尋一次, 然後 es 會合併來自所有分片的結果。例如,你要搜尋 10 個

index,每個 index 有 5 個分片,那麼協調這次搜尋的節點就需要合併 5x10=50

個分片的結果。這也是乙個你需要注意的地方:如果有太多分片的結果需要合併,或者你發起了乙個結果巨大的搜尋請求,合併任務會需要大量 cpu

和記憶體資源。這是第二個讓 index 少一些的理由。

使用 type 允許我們在乙個 index 裡儲存多種型別的資料,這樣就可以減少 index 的數量了。在使用時,向每個文件加入_type字段,在指定 type 搜尋時就會被用於過濾。使用 type 的乙個好處是,搜尋乙個 index 下的多個 type,和只搜尋乙個 type 相比沒有額外的開銷 —— 需要合併結果的分片數量是一樣的。

但是,這也是有限制的:

這是個困難的問題,它的答案取決於你用的硬體、資料和用例。首先你要明白 type 是有用的,因為它能減少 es 需要管理的 lucene

index 的數量。但是也有另外一種方式可以減少這個數量:建立 index 的時候讓它的分片少一些。例如,與其在乙個 index 裡塞上 5 個

type,不如建立 5 個只有乙個分片的 index。

在你做決定的時候可以問自己下面幾個問題:

總之,你可能有點驚訝,因為 type 的使用場景沒有你想象的多,這是正確的。由於我們上面提到原因,在乙個 index 中使用多個 type

的情景其實很少。如果你的資料有不同的對映,那就給他們分配不同的

index。但是請記住,如果不需要很高的寫入吞吐量,或者儲存的文件數量不多,你可以通過減少 index 的分片來使集群中的分片數量保持合理。

[1] posting list 和 doc value 都是 lucene 的壓縮技術,原理是儲存後乙個文件和前乙個文件的差異,而不是完整的文件。

type和 rowtype 的區別

type 屬性的一種方式是在變數宣告中使用。type是用於取得 表或游標中的字段型別,例如,可以使用它來宣告artist表中字段型別相同的變數,注意可以在表中名和字段之間使用點號 dealare v unit name kwmis xm unit bg.unit name type v bgoid ...

關於isinstance和type的區別

分析 type和isinstance都是python中用來判斷資料型別的,type相對與isinstance更加粗糙,建議使用具體的type,我們還可以使用c語言中的ctypes。isinstace的兩個引數,第一引數是乙個類的例項,在這個例子中的例項是子類b的例項 z,第二個引數是指定的類,或者其...

MySQL key與index的區別

一 key key 是資料庫的物理結構,處於模型層面的,它包含兩層意義和作用,一是約束 偏重於約束和規範資料庫的結構完整性 二是索引 輔助查詢用的 包括primary key,unique key,foreign key 等。primary key 有兩個作用,一是約束作用 constraint 用...