原文: 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 用...