Aracılığıyla paylaş


Azure DocumentDB'de Dizin Oluşturma En İyi Yöntemleri

Sorgulanabilir alanlarda her zaman dizinler oluşturulmalıdır

Koşul ve toplamaları temel alan okuma işlemleri, uygulanan filtreler için dizine başvurur. Dizinlerin olmaması halinde veritabanı altyapısı eşleşen belgeleri almak için bir belge taraması gerçekleştirir. Bir koleksiyondaki veri hacmi arttıkça taramalar her zaman pahalıdır ve giderek daha pahalı hale gelir. En iyi sorgu performansı için, tüm sorgulanabilir alanlar için her zaman dizinler oluşturulmalıdır.

Gereksiz dizinlerden ve tüm alanların varsayılan olarak dizine eklenmesinden kaçının

Dizinler yalnızca sorgulanabilir alanlar için oluşturulmalıdır. Joker karakter dizinlemesi, yalnızca belgedeki herhangi bir alanın sorgu filtrelerinin parçası olabileceği sorgu desenlerinin tahmin edilemediği durumlarda kullanılmalıdır.

İpucu

Azure DocumentDB varsayılan olarak yalnızca _id alanını dizine alır. Diğer tüm alanlar varsayılan olarak dizine alınmaz. Sorgu performansını en üst düzeye çıkarmak için dizine alınabilecek alanlar önceden planlanırken, çok fazla alanın dizine alınmasından kaynaklanan yazma işlemleri üzerindeki etki en aza indirilmelidir.

yeni bir belge ilk kez eklendiğinde veya varolan bir belge güncelleştirildiğinde veya silindiğinde, dizindeki belirtilen alanların her biri de güncelleştirilir. Dizin oluşturma ilkesi çok sayıda alan (veya belgedeki tüm alanlar) içeriyorsa, ilgili dizinleri güncelleştirmek için sunucu tarafından daha fazla kaynak kullanılır. Büyük ölçekte çalıştırılırken yalnızca sorgulanabilir alanların dizine alınması gerekirken, sorgu koşullarında kullanılmayan kalan tüm alanlar dizin dışında bırakılmalıdır.

Verimli veri alımı için dizin oluşturma stratejisi

Azure DocumentDB'ye büyük iş yükü geçişleri için verimli yürütme için veri yükünden sonra dizinler oluşturmanız önerilir. Bu, yazma yükünü önemli ölçüde azaltır, kaynak tüketimini en aza indirir ve veri alımı performansını hızlandırır. Toplu veri yükleme sırasında dizinlerin muhafaza edilmesi, her yazma işleminin tüm geçerli dizinleri güncellemesi gerektiğinden ekleme işlemlerini yavaşlatabilir.

Geçmiş verilerde oluşturulan birden çok dizin için, her alan için createIndex komutlarının engelini kaldırmama sorunu

Özellikle uygulama gereksinimleri geliştikçe tüm sorgu desenlerini önceden planlamak her zaman mümkün değildir. Uygulama gereksinimlerinin değiştirilmesi kaçınılmaz olarak büyük miktarda geçmiş veri içeren bir kümedeki dizine alanlar eklenmesini gerektirir.

Bu tür senaryolarda, her createIndex komutu sunucudan yanıt beklenmeden zaman uyumsuz olarak verilmelidir.

Uyarı

Varsayılan olarak, Azure DocumentDB bir createIndex işlemine yalnızca dizin tamamen geçmiş veriler üzerinde oluşturulduktan sonra yanıt verir. Kümenin boyutuna ve alınan veri hacmine bağlı olarak, bu işlem zaman alabilir ve sunucu createIndex komutuna yanıt vermiyor gibi görünebilir.

CreateIndex komutları Mongo Kabuğu aracılığıyla dağıtılıyorsa, Ctrl + C tuşlarını kullanarak komutu kesintiye uğratarak yanıt beklemeyi durdurun ve bir sonraki işlem kümesini çalıştırın.

Uyarı

Oluşturulduktan sonra createIndex komutunu kesmek için Ctrl + C tuşlarını kullanmak, sunucuda dizin derleme işlemini sonlandırmaz. Yalnızca Shell'in sunucudan gelen bir yanıtı beklemesini durdururken, sunucu zaman uyumsuz olarak dizini mevcut belgeler üzerinde oluşturmaya devam eder.

Birden çok alanda koşul içeren sorgular için Bileşik Dizinler oluşturma

Bileşik dizinler aşağıdaki senaryolarda kullanılmalıdır:

  • Birden çok alanda filtre içeren sorgular
  • Birden çok alanda filtre içeren ve bir veya daha fazla alanın artan veya azalan düzende sıralandığı sorgular

'cosmicworks' veritabanı ve 'çalışan' koleksiyonu içinde aşağıdaki belgeyi göz önünde bulundurun

{
    "firstName": "Steve",
    "lastName": "Smith",
    "companyName": "Microsoft",
    "division": "Azure",
    "subDivision": "Data & AI",
    "timeInOrgInYears": 7
}

Kuruluşta beş yıldan uzun süredir soyadı 'Smith' olan tüm çalışanları bulmak için aşağıdaki sorguyu göz önünde bulundurun:

db.employee.find({"lastName": "Smith", "timeInOrgInYears": {"$gt": 5}})

Hem 'lastName' hem de 'timeInOrgInYears' üzerindeki bileşik dizin bu sorguyu iyileştirir:

use cosmicworks;
db.employee.createIndex({"lastName" : 1, "timeInOrgInYears" : 1})

CreateIndex işleminin durumunu izleme

Dizinler eklendiğinde ve geçmiş verilerin dizine alınması gerektiğinde, dizin derleme işleminin ilerleme durumu db.currentOp() kullanılarak izlenebilir.

'cosmicworks' veritabanındaki dizin oluşturma ilerlemesini izlemek için bu örneği göz önünde bulundurun.

use cosmicworks;
db.currentOp()

CreateIndex işlemi devam ederken yanıt şöyle görünür:

{
  "inprog": [
    {
      "shard": "defaultShard",
      "active": true,
      "type": "op",
      "opid": "30000451493:1719209762286363",
      "op_prefix": 30000451493,
      "currentOpTime": "2024-06-24T06:16:02.000Z",
      "secs_running": 0,
      "command": { "aggregate": "" },
      "op": "command",
      "waitingForLock": false
    },
    {
      "shard": "defaultShard",
      "active": true,
      "type": "op",
      "opid": "30000451876:1719209638351743",
      "op_prefix": 30000451876,
      "currentOpTime": "2024-06-24T06:13:58.000Z",
      "secs_running": 124,
      "command": { "createIndexes": "" },
      "op": "workerCommand",
      "waitingForLock": false,
      "progress": {},
      "msg": ""
    }
  ],
  "ok": 1
}

Büyük Dizin Anahtarlarını varsayılan olarak etkinleştirme

Belgeler çok sayıda karakter içeren anahtarlar içermese veya belgeler birden çok iç içe yerleştirme düzeyi içermiyor olsa bile, büyük dizin anahtarları belirterek bu senaryoların ele alınmasını sağlar. Artık büyük dizin anahtarı, altyapının varsayılan davranışıdır.

'cosmicworks' veritabanındaki 'large_index_coll' koleksiyonunda büyük dizin anahtarlarını etkinleştirmek için bu örneği göz önünde bulundurun.

use cosmicworks;
db.runCommand(
{
 "createIndexes": "large_index_coll",
 "indexes": [
    {
        "key": { "ikey": 1 },
        "name": "ikey_1",
        "enableLargeIndexKeys": true
    }
    ]
})

Engelleme Seçeneğini Kullanarak Dizin Oluşturma İşlemlerine Yeni Yazma İşlemlerine Kıyasla Önceliklendirme

Veriler yüklenmeden önce dizinin oluşturulması gereken senaryolarda, dizin derlemesi tamamlanana kadar gelen yazmaları engellemek için engelleme seçeneği kullanılmalıdır.

Ayar { "blocking": true } , veri yazma işlemi başlamadan önce boş koleksiyonlarda dizinlerin oluşturulduğu geçiş yardımcı programlarında kullanışlıdır.

'cosmicworks' veritabanındaki 'employee' koleksiyonunda dizin oluşturma için engelleme seçeneğinin bir örneğini düşünün:

use cosmicworks;
db.runCommand({
  createIndexes: "employee",
  indexes: [{"key":{"name":1}, "name":"name_1"}],
  blocking: true
})

Metin tabanlı verilerin verimli bir şekilde aranmasını ve sorgulanabilmesini sağlayan metin dizini oluşturma bölümüne göz atın.

Sonraki adım