{"id":41251,"date":"2026-03-16T14:02:46","date_gmt":"2026-03-16T11:02:46","guid":{"rendered":"https:\/\/fatihsoysal.com\/blog\/mongodb-sorgulariniz-yavas-mi-calisiyor-performansi-nasil-artirirsiniz\/"},"modified":"2026-03-16T14:02:46","modified_gmt":"2026-03-16T11:02:46","slug":"mongodb-sorgulariniz-yavas-mi-calisiyor-performansi-nasil-artirirsiniz","status":"publish","type":"post","link":"https:\/\/fatihsoysal.com\/blog\/mongodb-sorgulariniz-yavas-mi-calisiyor-performansi-nasil-artirirsiniz\/","title":{"rendered":"MongoDB Sorgular\u0131n\u0131z Yava\u015f m\u0131 \u00c7al\u0131\u015f\u0131yor? Performans\u0131 Nas\u0131l Art\u0131r\u0131rs\u0131n\u0131z?"},"content":{"rendered":"<p><title>MongoDB \u0130ndeksleri: Node.js ile Sorgu Performans\u0131n\u0131 Nas\u0131l \u0130yile\u015ftirirsiniz?<\/title><br \/>\n<body><\/p>\n<h2>MongoDB Sorgular\u0131n\u0131z Yava\u015f m\u0131 \u00c7al\u0131\u015f\u0131yor? Performans\u0131 Nas\u0131l Art\u0131r\u0131rs\u0131n\u0131z?<\/h2>\n<p>MongoDB sorgu performans\u0131n\u0131 Node.js uygulamalar\u0131n\u0131zda optimize etmek mi istiyorsunuz? \u0130ndekslerin g\u00fcc\u00fcn\u00fc ke\u015ffedin ve veri taban\u0131 i\u015flemlerinizi h\u0131zland\u0131rarak kullan\u0131c\u0131 deneyiminizi geli\u015ftirin. B\u00fcy\u00fck veri k\u00fcmeleriyle \u00e7al\u0131\u015f\u0131rken veya yo\u011fun sorgu trafi\u011fi olan uygulamalar geli\u015ftirirken, veri taban\u0131 performans\u0131n\u0131 g\u00f6z ard\u0131 etmek, kullan\u0131c\u0131 deneyimini do\u011frudan etkileyen ciddi sorunlara yol a\u00e7abilir. \u00d6zellikle Node.js gibi modern, y\u00fcksek performansl\u0131 bir \u00e7al\u0131\u015fma zaman\u0131 ile MongoDB gibi esnek bir NoSQL veri taban\u0131n\u0131 bir araya getirdi\u011finizde, uygulaman\u0131z\u0131n h\u0131z\u0131n\u0131 belirleyen en kritik fakt\u00f6rlerden biri, veri taban\u0131 sorgular\u0131n\u0131z\u0131n ne kadar verimli \u00e7al\u0131\u015ft\u0131\u011f\u0131d\u0131r. Peki, sorgular\u0131n\u0131z\u0131n yan\u0131t s\u00fcresi uzad\u0131\u011f\u0131nda, kullan\u0131c\u0131lar\u0131n\u0131z\u0131n bekleme s\u00fcreleri artt\u0131\u011f\u0131nda veya uygulaman\u0131z genel olarak yava\u015flad\u0131\u011f\u0131nda ne yapmal\u0131s\u0131n\u0131z? \u0130\u015fte bu noktada MongoDB indeksleri devreye giriyor ve veri taban\u0131 performans\u0131n\u0131z\u0131 adeta sihirli bir dokunu\u015fla bamba\u015fka bir seviyeye ta\u015f\u0131yor.<\/p>\n<p>Bu makalede, MongoDB indekslerinin temel prensiplerinden ba\u015flayarak, farkl\u0131 indeks t\u00fcrlerini, Node.js ile indeksleri nas\u0131l olu\u015fturaca\u011f\u0131n\u0131z\u0131 ve y\u00f6netece\u011finizi ad\u0131m ad\u0131m ke\u015ffedece\u011fiz. Ayr\u0131ca, sorgu planlar\u0131n\u0131 analiz etmek i\u00e7in <code>explain()<\/code> metodunu nas\u0131l kullanaca\u011f\u0131n\u0131z\u0131, ger\u00e7ek d\u00fcnya senaryolar\u0131nda indeks optimizasyonlar\u0131n\u0131 nas\u0131l uygulayaca\u011f\u0131n\u0131z\u0131 ve ileri d\u00fczey ipu\u00e7lar\u0131n\u0131 da ele alaca\u011f\u0131z. Amac\u0131m\u0131z, uygulaman\u0131z\u0131n veri eri\u015fim h\u0131z\u0131n\u0131 art\u0131rarak, daha ak\u0131c\u0131 ve daha duyarl\u0131 bir kullan\u0131c\u0131 deneyimi sunman\u0131za yard\u0131mc\u0131 olmakt\u0131r. \u0130ster yeni ba\u015flayan bir geli\u015ftirici olun ister deneyimli bir profesyonel, bu rehber, MongoDB indeksleme stratejilerinizi geli\u015ftirmek ve Node.js uygulamalar\u0131n\u0131z\u0131n potansiyelini tam olarak ortaya \u00e7\u0131karmak i\u00e7in size kapsaml\u0131 bir yol haritas\u0131 sunacakt\u0131r. Haz\u0131rsan\u0131z, MongoDB indekslerinin derinliklerine dalal\u0131m ve sorgu performans\u0131n\u0131z\u0131 nas\u0131l zirveye ta\u015f\u0131yaca\u011f\u0131n\u0131z\u0131 \u00f6\u011frenelim.<\/p>\n<h2>MongoDB \u0130ndeksleri Nedir ve Neden \u00d6nemlidir?<\/h2>\n<p>MongoDB indeksleri, veri taban\u0131ndaki belgeler \u00fczerinde h\u0131zl\u0131 ve verimli arama i\u015flemleri yap\u0131lmas\u0131na olanak tan\u0131yan \u00f6zel veri yap\u0131lar\u0131d\u0131r. Bu kavram\u0131 daha iyi anlamak i\u00e7in bir analoji kullanabiliriz: B\u00fcy\u00fck bir ansiklopedi d\u00fc\u015f\u00fcn\u00fcn. E\u011fer bu ansiklopedide belirli bir konuyu ar\u0131yorsan\u0131z, her sayfay\u0131 tek tek kar\u0131\u015ft\u0131rmak yerine, ansiklopedinin sonundaki indeksi kullan\u0131rs\u0131n\u0131z. \u0130ndeks, arad\u0131\u011f\u0131n\u0131z konunun hangi sayfalarda ge\u00e7ti\u011fini size an\u0131nda g\u00f6sterir. MongoDB indeksleri de tam olarak bu prensiple \u00e7al\u0131\u015f\u0131r; veri taban\u0131n\u0131zdaki koleksiyonlarda belirli alanlar \u00fczerinde bir t\u00fcr k\u0131sayol veya harita olu\u015fturur.<\/p>\n<p>Peki, indeksler tam olarak nas\u0131l \u00e7al\u0131\u015f\u0131r? \u00c7o\u011fu MongoDB indeksi, B-tree (dengeli a\u011fa\u00e7) veri yap\u0131s\u0131n\u0131 kullan\u0131r. Bu yap\u0131, verileri s\u0131ral\u0131 bir \u015fekilde depolar ve bu sayede belirli bir de\u011feri aramak, aral\u0131k sorgular\u0131 yapmak veya verileri s\u0131ralamak \u00e7ok daha h\u0131zl\u0131 hale gelir. \u0130ndeksler, genellikle s\u0131k\u00e7a sorgulanan, filtrelenen veya s\u0131ralanan alanlar \u00fczerine olu\u015fturulur. Bir indeks olu\u015fturdu\u011funuzda, MongoDB, o alan\u0131n de\u011ferlerini ve ilgili belgenin konumunu i\u00e7eren ayr\u0131 bir veri yap\u0131s\u0131 olu\u015fturur. B\u00f6ylece, bir sorgu geldi\u011finde, MongoDB t\u00fcm koleksiyonu taramak (full collection scan &#8211; COLLSCAN) yerine, do\u011frudan indekse ba\u015fvurarak ilgili belgelere \u00e7ok daha h\u0131zl\u0131 ula\u015fabilir (index scan &#8211; IXSCAN).<\/p>\n<p>\u0130ndekslerin sa\u011flad\u0131\u011f\u0131 faydalar saymakla bitmez. En belirgin faydas\u0131, elbette, sorgu h\u0131zland\u0131rmas\u0131d\u0131r. \u00d6zellikle b\u00fcy\u00fck koleksiyonlarda, uygun indeksler olmadan yap\u0131lan sorgular dakikalar s\u00fcrebilirken, indekslerle bu s\u00fcre milisaniyelere inebilir. Ayr\u0131ca, indeksler yaln\u0131zca arama i\u015flemlerini de\u011fil, ayn\u0131 zamanda s\u0131ralama (sort) i\u015flemlerini de h\u0131zland\u0131r\u0131r. E\u011fer bir sorgu hem filtreleme hem de s\u0131ralama i\u00e7eriyorsa ve bu alanlar \u00fczerinde uygun bir bile\u015fik indeks varsa, MongoDB hem filtreleme hem de s\u0131ralama i\u015flemini indeks \u00fczerinden yaparak performans\u0131 maksimize eder. \u0130ndeksler ayr\u0131ca, belirli bir alan\u0131n benzersiz olmas\u0131n\u0131 sa\u011flamak gibi k\u0131s\u0131tlamalar uygulamak i\u00e7in de kullan\u0131labilir; \u00f6rne\u011fin, bir e-posta adresinin veri taban\u0131nda sadece bir kez bulunmas\u0131n\u0131 garanti edebilirsiniz.<\/p>\n<p>Ancak, indekslerin baz\u0131 maliyetleri de vard\u0131r. Her indeks, disk \u00fczerinde ek yer kaplar ve veri taban\u0131n\u0131z\u0131n toplam boyutunu art\u0131r\u0131r. Daha da \u00f6nemlisi, bir belgeye her yazma (insert, update, delete) i\u015flemi yap\u0131ld\u0131\u011f\u0131nda, ilgili indekslerin de g\u00fcncellenmesi gerekir. Bu durum, yazma yo\u011fun uygulamalarda indekslerin yazma performans\u0131n\u0131 d\u00fc\u015f\u00fcrmesine neden olabilir. Bu nedenle, indeksleri stratejik bir \u015fekilde ve yaln\u0131zca ger\u00e7ekten ihtiya\u00e7 duyulan alanlara uygulamak \u00f6nemlidir. K\u0131sacas\u0131, indeksler, okuma yo\u011fun uygulamalar i\u00e7in bir cankurtaran halat\u0131yken, yazma yo\u011fun uygulamalarda dikkatli bir \u015fekilde y\u00f6netilmesi gereken g\u00fc\u00e7l\u00fc bir ara\u00e7t\u0131r. Do\u011fru indeksleme stratejileriyle, Node.js uygulaman\u0131z\u0131n MongoDB ile olan etkile\u015fimini dramatik bir \u015fekilde iyile\u015ftirebilirsiniz.<\/p>\n<h2>\u0130ndeks T\u00fcrleri ve Kullan\u0131m Senaryolar\u0131: Hangi \u0130ndeks T\u00fcr\u00fc Sizin \u0130\u00e7in Uygun?<\/h2>\n<p>MongoDB, farkl\u0131 sorgu ihtiya\u00e7lar\u0131n\u0131 kar\u015f\u0131lamak \u00fczere \u00e7e\u015fitli indeks t\u00fcrleri sunar. Her bir indeks t\u00fcr\u00fc, belirli senaryolar i\u00e7in optimize edilmi\u015ftir ve uygulaman\u0131z\u0131n performans\u0131n\u0131 art\u0131rmak i\u00e7in do\u011fru indeksi se\u00e7mek kritik \u00f6neme sahiptir. Bu b\u00f6l\u00fcmde, en yayg\u0131n indeks t\u00fcrlerini ve bunlar\u0131n hangi durumlarda kullan\u0131lmas\u0131 gerekti\u011fini detayl\u0131 bir \u015fekilde inceleyece\u011fiz.<\/p>\n<h3>Tek Alan \u0130ndeksleri: En Basit ve Etkili \u00c7\u00f6z\u00fcm<\/h3>\n<p>Tek alan indeksleri, ad\u0131ndan da anla\u015f\u0131laca\u011f\u0131 gibi, bir koleksiyondaki tek bir alan \u00fczerine olu\u015fturulan indekslerdir. Bu, MongoDB&#8217;deki en temel ve en yayg\u0131n indeks t\u00fcr\u00fcd\u00fcr. Bir alan \u00fczerinde filtreleme veya s\u0131ralama yapt\u0131\u011f\u0131n\u0131zda, tek alan indeksi sorgu performans\u0131n\u0131 \u00f6nemli \u00f6l\u00e7\u00fcde art\u0131rabilir. \u00d6rne\u011fin, bir kullan\u0131c\u0131 koleksiyonunuz varsa ve kullan\u0131c\u0131lar\u0131 e-posta adresine g\u00f6re s\u0131k s\u0131k ar\u0131yorsan\u0131z, <code>email<\/code> alan\u0131 \u00fczerinde bir tek alan indeksi olu\u015fturmak \u00e7ok mant\u0131kl\u0131 olacakt\u0131r. Bu indeksler, verileri artan (<code>1<\/code>) veya azalan (<code>-1<\/code>) s\u0131rada depolayabilir. \u00c7o\u011fu durumda, s\u0131ralama y\u00f6n\u00fc performans \u00fczerinde b\u00fcy\u00fck bir etkiye sahip de\u011fildir, ancak bazen belirli s\u0131ralama sorgular\u0131 i\u00e7in do\u011fru y\u00f6n\u00fc se\u00e7mek faydal\u0131 olabilir. Tek alan indeksleri, basit <code>find()<\/code> sorgular\u0131, <code>sort()<\/code> i\u015flemleri ve <code>$exists<\/code>, <code>$type<\/code> gibi operat\u00f6rlerle yap\u0131lan filtrelemeler i\u00e7in idealdir. Uygulaman\u0131zdaki temel arama ve filtreleme ihtiya\u00e7lar\u0131 i\u00e7in genellikle ilk tercihiniz olmal\u0131d\u0131r.<\/p>\n<pre><code>\n      db.kullanicilar.createIndex({ email: 1 });\n    <\/code><\/pre>\n<h3>Bile\u015fik \u0130ndeksler: \u00c7oklu Alanlarda Sorgulama ve S\u0131ralama<\/h3>\n<p>Bile\u015fik indeksler, birden fazla alan\u0131 tek bir indekste birle\u015ftirir. Bu indeksler, ayn\u0131 anda birden fazla alana g\u00f6re filtreleme yapan veya bir alana g\u00f6re filtreleyip di\u011ferine g\u00f6re s\u0131ralayan sorgular i\u00e7in olduk\u00e7a etkilidir. Bile\u015fik indekslerde alanlar\u0131n s\u0131ras\u0131 kritik \u00f6neme sahiptir. MongoDB, indeksleri soldan sa\u011fa do\u011fru kullan\u0131r, bu nedenle sorgunuzun en se\u00e7ici alan\u0131n\u0131 (yani en \u00e7ok filtreleme yapan alan\u0131) indeksin ba\u015f\u0131na koymak genellikle en iyi performans\u0131 sa\u011flar. Bu kurala ESR (Equality, Sort, Range) kural\u0131 denir: E\u015fitlik sorgular\u0131 (<code>$eq<\/code>), s\u0131ralama (<code>$sort<\/code>) ve aral\u0131k sorgular\u0131 (<code>$gt<\/code>, <code>$lt<\/code>) s\u0131ras\u0131na g\u00f6re alanlar\u0131n\u0131z\u0131 indekslemelisiniz. \u00d6rne\u011fin, bir e-ticaret uygulamas\u0131nda \u00fcr\u00fcnleri kategoriye g\u00f6re filtreleyip fiyata g\u00f6re s\u0131ral\u0131yorsan\u0131z, <code>{ kategori: 1, fiyat: 1 }<\/code> \u015feklinde bir bile\u015fik indeks, bu t\u00fcr sorgular\u0131 \u00e7ok h\u0131zl\u0131 hale getirecektir. Ancak, yaln\u0131zca <code>fiyat<\/code> alan\u0131na g\u00f6re bir sorgu yaparsan\u0131z, bu indeksin <code>fiyat<\/code> k\u0131sm\u0131n\u0131 tek ba\u015f\u0131na kullanamayaca\u011f\u0131n\u0131 unutmay\u0131n; MongoDB&#8217;nin indeksi kullanabilmesi i\u00e7in sorgunuzun indeksin ba\u015ftaki alanlar\u0131n\u0131 i\u00e7ermesi gerekir. Bile\u015fik indeksler, \u00f6zellikle karma\u015f\u0131k filtreleme ve s\u0131ralama kombinasyonlar\u0131 i\u00e7eren sorgular i\u00e7in vazge\u00e7ilmezdir.<\/p>\n<pre><code>\n      db.urunler.createIndex({ kategori: 1, fiyat: -1 }); \/\/ Kategoriye g\u00f6re artan, fiyata g\u00f6re azalan\n    <\/code><\/pre>\n<h3>\u00c7ok Anahtarl\u0131 (Multikey) \u0130ndeksler: Dizi Alanlar\u0131 \u0130\u00e7in Optimizasyon<\/h3>\n<p>MongoDB, bir belgedeki dizi (array) i\u00e7eren bir alan \u00fczerinde indeks olu\u015fturdu\u011funuzda, otomatik olarak bir \u00e7ok anahtarl\u0131 indeks olu\u015fturur. Bu indeks t\u00fcr\u00fc, dizinin her bir eleman\u0131 i\u00e7in ayr\u0131 bir indeks giri\u015fi olu\u015fturur. Bu sayede, bir dizinin i\u00e7inde belirli bir de\u011feri arayan sorgular \u00e7ok daha h\u0131zl\u0131 \u00e7al\u0131\u015f\u0131r. \u00d6rne\u011fin, bir belgenin <code>etiketler<\/code> ad\u0131nda bir dizi alan\u0131 varsa ve bu etiketler aras\u0131nda arama yapmak istiyorsan\u0131z, <code>etiketler<\/code> alan\u0131 \u00fczerinde bir indeks olu\u015fturman\u0131z yeterlidir. MongoDB, bu indeksi otomatik olarak \u00e7ok anahtarl\u0131 bir indeks olarak alg\u0131lar ve y\u00f6netir. Bu indeksler, <code>$in<\/code>, <code>$all<\/code> gibi dizi operat\u00f6rleriyle yap\u0131lan sorgular i\u00e7in idealdir. \u00c7ok anahtarl\u0131 indeksler, \u00f6zellikle etiketler, kategoriler, yetkiler gibi birden fazla de\u011fere sahip olabilen alanlar\u0131 s\u0131k\u00e7a sorgulad\u0131\u011f\u0131n\u0131z senaryolarda hayat kurtar\u0131c\u0131d\u0131r.<\/p>\n<pre><code>\n      db.makaleler.createIndex({ etiketler: 1 }); \/\/ \"etiketler\" bir dizi olsa bile \u00e7al\u0131\u015f\u0131r\n    <\/code><\/pre>\n<h3>TTL (Time-To-Live) \u0130ndeksler: Otomatik Veri Silme \u0130\u015flemleri<\/h3>\n<p>TTL indeksleri, belirli bir s\u00fcre sonra belgeleri otomatik olarak bir koleksiyondan silmek i\u00e7in kullan\u0131l\u0131r. Bu indeksler, genellikle oturum verileri, log kay\u0131tlar\u0131, \u00f6nbellek verileri gibi belirli bir \u00f6mr\u00fc olan verileri y\u00f6netmek i\u00e7in idealdir. Bir TTL indeksi olu\u015fturdu\u011funuzda, bir tarih (<code>Date<\/code>) alan\u0131n\u0131 ve belgelerin ne kadar s\u00fcre sonra silinece\u011fini belirten bir saniye de\u011ferini belirtirsiniz. MongoDB, arka planda \u00e7al\u0131\u015fan bir i\u015flemle, s\u00fcresi dolan belgeleri otomatik olarak temizler. Bu, manuel temizleme i\u015flemlerine gerek kalmadan veri taban\u0131n\u0131z\u0131n boyutunu y\u00f6netmenize ve g\u00fcncel kalmas\u0131n\u0131 sa\u011flaman\u0131za yard\u0131mc\u0131 olur. TTL indeksleri, veri taban\u0131n\u0131zdaki &#8220;eski&#8221; verilerin otomatik olarak temizlenmesini sa\u011flayarak disk alan\u0131 ve performans optimizasyonu a\u00e7\u0131s\u0131ndan b\u00fcy\u00fck kolayl\u0131k sa\u011flar.<\/p>\n<pre><code>\n      db.loglar.createIndex({ createdAt: 1 }, { expireAfterSeconds: 3600 }); \/\/ 1 saat sonra sil\n    <\/code><\/pre>\n<h3>Text \u0130ndeksler: Metin Arama Yetenekleri<\/h3>\n<p>Text indeksleri, koleksiyonlardaki metin i\u00e7eri\u011fi \u00fczerinde tam metin arama yap\u0131lmas\u0131na olanak tan\u0131r. Bu indeksler, genellikle blog yaz\u0131lar\u0131, \u00fcr\u00fcn a\u00e7\u0131klamalar\u0131, yorumlar gibi b\u00fcy\u00fck metin alanlar\u0131nda anahtar kelime aramalar\u0131 yapmak i\u00e7in kullan\u0131l\u0131r. Bir text indeksi olu\u015fturdu\u011funuzda, MongoDB, belirtilen alanlardaki kelimeleri indeksler ve bu kelimeler \u00fczerinde h\u0131zl\u0131 arama yap\u0131lmas\u0131n\u0131 sa\u011flar. Text indeksleri, <code>$text<\/code> operat\u00f6r\u00fc ve <code>$search<\/code> sorgu operat\u00f6r\u00fc ile birlikte kullan\u0131l\u0131r. Ayr\u0131ca, arama sonu\u00e7lar\u0131n\u0131 alaka d\u00fczeyine g\u00f6re s\u0131ralamak i\u00e7in bir skor (<code>$meta: \"textScore\"<\/code>) da d\u00f6nd\u00fcrebilir. Tek bir koleksiyonda yaln\u0131zca bir text indeksi olabilir, ancak bu indeks birden fazla metin alan\u0131n\u0131 kapsayabilir. Bu, kullan\u0131c\u0131lar\u0131n uygulaman\u0131zda g\u00fc\u00e7l\u00fc ve esnek metin aramalar\u0131 yapmas\u0131n\u0131 sa\u011flamak i\u00e7in harika bir yoldur.<\/p>\n<pre><code>\n      db.makaleler.createIndex({ baslik: \"text\", icerik: \"text\" });\n      \/\/ Sorgu \u00f6rne\u011fi:\n      \/\/ db.makaleler.find({ $text: { $search: \"MongoDB performans\" } });\n    <\/code><\/pre>\n<h3>Geospasyal \u0130ndeksler: Konum Tabanl\u0131 Sorgular<\/h3>\n<p>Geospasyal indeksler, co\u011frafi konum verileri \u00fczerinde sorgulama yapmak i\u00e7in tasarlanm\u0131\u015ft\u0131r. Bu indeksler, belirli bir noktaya yak\u0131n yerleri bulma (<code>$near<\/code>, <code>$geoWithin<\/code>), belirli bir alan i\u00e7indeki noktalar\u0131 sorgulama veya iki nokta aras\u0131ndaki mesafeyi hesaplama gibi konum tabanl\u0131 uygulamalar i\u00e7in vazge\u00e7ilmezdir. MongoDB iki ana geospasyal indeks t\u00fcr\u00fc sunar: <code>2dsphere<\/code> indeksleri ve <code>2d<\/code> indeksleri. <code>2dsphere<\/code> indeksleri, d\u00fcnya \u00fczerindeki k\u00fcresel y\u00fczeylerdeki konumlar\u0131 (enlem ve boylam) destekler ve karma\u015f\u0131k co\u011frafi sorgular i\u00e7in daha g\u00fc\u00e7l\u00fcd\u00fcr. <code>2d<\/code> indeksleri ise daha basit, d\u00fczlemsel (iki boyutlu) koordinatlar i\u00e7in kullan\u0131l\u0131r. Harita tabanl\u0131 uygulamalar, konum tabanl\u0131 servisler veya lojistik uygulamalar\u0131 geli\u015ftiriyorsan\u0131z, geospasyal indeksler sorgu performans\u0131n\u0131z\u0131 dramatik bir \u015fekilde iyile\u015ftirecektir.<\/p>\n<pre><code>\n      db.restoranlar.createIndex({ konum: \"2dsphere\" }); \/\/ Konum \"GeoJSON\" format\u0131nda olmal\u0131\n    <\/code><\/pre>\n<p>Her indeks t\u00fcr\u00fcn\u00fcn kendine \u00f6zg\u00fc avantajlar\u0131 ve kullan\u0131m alanlar\u0131 vard\u0131r. Uygulaman\u0131z\u0131n sorgu desenlerini ve veri eri\u015fim ihtiya\u00e7lar\u0131n\u0131 dikkatlice analiz ederek, en uygun indeks kombinasyonlar\u0131n\u0131 se\u00e7mek, MongoDB veri taban\u0131n\u0131z\u0131n ve dolay\u0131s\u0131yla Node.js uygulaman\u0131z\u0131n genel performans\u0131n\u0131 maksimize etmenin anahtar\u0131d\u0131r. Do\u011fru indeksleme stratejisiyle, veri taban\u0131n\u0131zdaki verilere eri\u015fim h\u0131z\u0131n\u0131 art\u0131rabilir ve kullan\u0131c\u0131lar\u0131n\u0131za daha ak\u0131c\u0131 bir deneyim sunabilirsiniz.<\/p>\n<h2>Node.js ile MongoDB \u0130ndekslerini Nas\u0131l Olu\u015fturur ve Y\u00f6netirsiniz?<\/h2>\n<p>Node.js uygulamalar\u0131n\u0131zda MongoDB indekslerini olu\u015fturmak ve y\u00f6netmek olduk\u00e7a kolayd\u0131r. MongoDB&#8217;nin resmi Node.js s\u00fcr\u00fcc\u00fcs\u00fc veya pop\u00fcler bir ODM (Object Data Modeling) k\u00fct\u00fcphanesi olan Mongoose arac\u0131l\u0131\u011f\u0131yla bu i\u015flemleri ger\u00e7ekle\u015ftirebilirsiniz. Her iki yakla\u015f\u0131m da benzer mant\u0131kla \u00e7al\u0131\u015f\u0131r, ancak Mongoose, schema tabanl\u0131 yap\u0131s\u0131yla daha entegre bir deneyim sunar. \u0130\u015fte ad\u0131m ad\u0131m Node.js ile indeksleri nas\u0131l olu\u015fturaca\u011f\u0131n\u0131z ve y\u00f6netece\u011finize dair detayl\u0131 bir rehber:<\/p>\n<h3>MongoDB Driver ile \u0130ndeks Olu\u015fturma<\/h3>\n<p>\u00d6ncelikle, uygulaman\u0131zda MongoDB driver&#8217;\u0131n\u0131 kurman\u0131z ve bir veri taban\u0131 ba\u011flant\u0131s\u0131 olu\u015fturman\u0131z gerekir. Ard\u0131ndan, <code>createIndex()<\/code> metodunu kullanarak indekslerinizi tan\u0131mlayabilirsiniz. Bu metod, belirtilen alanlar \u00fczerinde bir indeks olu\u015fturur. E\u011fer ayn\u0131 isimde bir indeks zaten varsa, MongoDB mevcut indeksi yeniden olu\u015fturmaz; bu, i\u015flemin idempotent oldu\u011fu anlam\u0131na gelir.<\/p>\n<pre><code>\n      const { MongoClient } = require('mongodb');\n\n      async function connectToDb() {\n        const uri = \"mongodb:\/\/localhost:27017\"; \/\/ Kendi MongoDB URI'nizi buraya yaz\u0131n\n        const client = new MongoClient(uri);\n\n        try {\n          await client.connect();\n          console.log(\"MongoDB'ye ba\u015far\u0131yla ba\u011fland\u0131!\");\n          const db = client.db(\"uygulamaDb\"); \/\/ Veri taban\u0131 ad\u0131n\u0131z\n          const collection = db.collection(\"kullanicilar\"); \/\/ Koleksiyon ad\u0131n\u0131z\n\n          \/\/ Tek alan indeksi olu\u015fturma\n          await collection.createIndex({ email: 1 });\n          console.log(\"Email alan\u0131 i\u00e7in tek alan indeksi olu\u015fturuldu.\");\n\n          \/\/ Bile\u015fik indeks olu\u015fturma\n          await collection.createIndex({ kategori: 1, fiyat: -1 });\n          console.log(\"Kategori ve fiyat i\u00e7in bile\u015fik indeks olu\u015fturuldu.\");\n\n          \/\/ TTL indeksi olu\u015fturma (\u00f6rne\u011fin, log kay\u0131tlar\u0131 i\u00e7in)\n          await collection.createIndex({ createdAt: 1 }, { expireAfterSeconds: 3600 });\n          console.log(\"Loglar i\u00e7in TTL indeksi olu\u015fturuldu (1 saat \u00f6m\u00fcrl\u00fc).\");\n\n          \/\/ Mevcut indeksleri listeleme\n          const indexes = await collection.indexes();\n          console.log(\"Koleksiyondaki mevcut indeksler:\", indexes);\n\n          \/\/ \u0130ndeks silme (\u00f6rne\u011fin, \"email_1\" ad\u0131ndaki indeksi)\n          \/\/ \u0130ndeks ad\u0131n\u0131 'indexes' \u00e7\u0131kt\u0131s\u0131ndan alabilirsiniz, genellikle alan ad\u0131 ve s\u0131ralama y\u00f6n\u00fc ile olu\u015fur.\n          \/\/ await collection.dropIndex(\"email_1\");\n          \/\/ console.log(\"Email indeksi silindi.\");\n\n        } catch (error) {\n          console.error(\"MongoDB i\u015flemi s\u0131ras\u0131nda bir hata olu\u015ftu:\", error);\n        } finally {\n          await client.close();\n          console.log(\"MongoDB ba\u011flant\u0131s\u0131 kapat\u0131ld\u0131.\");\n        }\n      }\n\n      connectToDb();\n    <\/code><\/pre>\n<p>Yukar\u0131daki \u00f6rnekte, <code>createIndex()<\/code> metodunu kullanarak farkl\u0131 indeks t\u00fcrlerini nas\u0131l olu\u015fturabilece\u011finizi g\u00f6rebilirsiniz. <code>expireAfterSeconds<\/code> se\u00e7ene\u011fi TTL indeksleri i\u00e7in kullan\u0131l\u0131rken, di\u011fer indeks t\u00fcrleri i\u00e7in ek se\u00e7enekler (\u00f6rne\u011fin, <code>unique: true<\/code> for unique indexes) de belirtebilirsiniz. <code>collection.indexes()<\/code> metodu, bir koleksiyondaki t\u00fcm indekslerin bir listesini d\u00f6nd\u00fcr\u00fcrken, <code>collection.dropIndex()<\/code> metodu belirli bir indeksi silmek i\u00e7in kullan\u0131l\u0131r. MongoDB&#8217;nin eski s\u00fcr\u00fcmlerinde kullan\u0131lan <code>ensureIndex()<\/code> metodu art\u0131k deprecated (kullan\u0131mdan kald\u0131r\u0131lm\u0131\u015ft\u0131r) ve yerine <code>createIndex()<\/code> kullan\u0131lmal\u0131d\u0131r.<\/p>\n<h3>Mongoose ile \u0130ndeks Olu\u015fturma<\/h3>\n<p>Mongoose kullan\u0131yorsan\u0131z, indeksleri do\u011frudan schema tan\u0131m\u0131n\u0131z i\u00e7inde belirtebilirsiniz, bu da kodunuzu daha d\u00fczenli ve okunabilir hale getirir. Mongoose, uygulaman\u0131z ba\u015flad\u0131\u011f\u0131nda bu indeksleri otomatik olarak olu\u015fturmaya \u00e7al\u0131\u015f\u0131r. Ancak, \u00fcretim ortamlar\u0131nda bu otomatik olu\u015fturma i\u015flemini devre d\u0131\u015f\u0131 b\u0131rak\u0131p indeksleri manuel olarak veya bir migrasyon scripti arac\u0131l\u0131\u011f\u0131yla y\u00f6netmek daha g\u00fcvenli bir yakla\u015f\u0131m olabilir.<\/p>\n<pre><code>\n      const mongoose = require('mongoose');\n\n      mongoose.connect('mongodb:\/\/localhost:27017\/uygulamaDb', { useNewUrlParser: true, useUnifiedTopology: true })\n        .then(() => console.log('MongoDB Mongoose ile ba\u015far\u0131yla ba\u011fland\u0131!'))\n        .catch(err => console.error('Mongoose ba\u011flant\u0131 hatas\u0131:', err));\n\n      const KullaniciSchema = new mongoose.Schema({\n        ad: String,\n        email: { type: String, required: true, unique: true }, \/\/ Benzersiz indeks otomatik olu\u015fur\n        createdAt: { type: Date, default: Date.now }\n      });\n\n      \/\/ Tek alan indeksi tan\u0131mlama\n      KullaniciSchema.index({ ad: 1 });\n\n      \/\/ Bile\u015fik indeks tan\u0131mlama\n      const UrunSchema = new mongoose.Schema({\n        isim: String,\n        kategori: String,\n        fiyat: Number,\n        stok: Number\n      });\n\n      UrunSchema.index({ kategori: 1, fiyat: -1 });\n\n      \/\/ TTL indeksi tan\u0131mlama (\u00f6rne\u011fin, oturumlar i\u00e7in)\n      const SessionSchema = new mongoose.Schema({\n        sessionData: Object,\n        createdAt: { type: Date, expires: '1h', default: Date.now } \/\/ 1 saat sonra sil\n      });\n\n      const Kullanici = mongoose.model('Kullanici', KullaniciSchema);\n      const Urun = mongoose.model('Urun', UrunSchema);\n      const Session = mongoose.model('Session', SessionSchema);\n\n      async function createMongooseIndexes() {\n        try {\n          await Kullanici.createIndexes(); \/\/ T\u00fcm tan\u0131ml\u0131 indeksleri olu\u015fturur\n          console.log(\"Kullan\u0131c\u0131 indeksleri olu\u015fturuldu.\");\n\n          await Urun.createIndexes();\n          console.log(\"\u00dcr\u00fcn indeksleri olu\u015fturuldu.\");\n\n          await Session.createIndexes();\n          console.log(\"Oturum TTL indeksi olu\u015fturuldu.\");\n\n          \/\/ \u0130ndeksleri kontrol etmek i\u00e7in:\n          \/\/ const userIndexes = await Kullanici.listIndexes();\n          \/\/ console.log(\"Kullan\u0131c\u0131 koleksiyonu indeksleri:\", userIndexes);\n\n        } catch (error) {\n          console.error(\"Mongoose indeks olu\u015fturma hatas\u0131:\", error);\n        } finally {\n          \/\/ mongoose.connection.close();\n        }\n      }\n\n      createMongooseIndexes();\n    <\/code><\/pre>\n<p>Mongoose&#8217;da, <code>unique: true<\/code> se\u00e7ene\u011fini bir schema alan\u0131na ekledi\u011finizde, Mongoose o alan i\u00e7in otomatik olarak benzersiz bir indeks olu\u015fturur. TTL indeksleri i\u00e7in <code>expires<\/code> se\u00e7ene\u011fini kullanabilirsiniz (\u00f6rne\u011fin, <code>expires: '1h'<\/code> veya <code>expires: 3600<\/code>). T\u00fcm tan\u0131ml\u0131 indeksleri olu\u015fturmak i\u00e7in model \u00fczerinde <code>createIndexes()<\/code> metodunu \u00e7a\u011f\u0131rabilirsiniz. Bu metod, uygulaman\u0131z\u0131n ba\u015flang\u0131c\u0131nda veya belirli bir migrasyon scripti i\u00e7inde \u00e7al\u0131\u015ft\u0131r\u0131labilir.<\/p>\n<p>\u0130ndeksleri olu\u015fturduktan sonra, bunlar\u0131n ger\u00e7ekten sorgu performans\u0131n\u0131z\u0131 iyile\u015ftirip iyile\u015ftirmedi\u011fini anlamak i\u00e7in sorgu planlar\u0131n\u0131 analiz etmeniz gerekecektir. Bu, bir sonraki b\u00f6l\u00fcmde ele alaca\u011f\u0131m\u0131z <code>explain()<\/code> metodu ile m\u00fcmk\u00fcn olacakt\u0131r. \u0130ndeks y\u00f6netimi, uygulaman\u0131z\u0131n ya\u015fam d\u00f6ng\u00fcs\u00fc boyunca devam eden bir s\u00fcre\u00e7tir; yeni sorgu desenleri ortaya \u00e7\u0131kt\u0131k\u00e7a veya veri boyutlar\u0131 de\u011fi\u015ftik\u00e7e indekslerinizi g\u00f6zden ge\u00e7irmeniz ve ayarlaman\u0131z gerekebilir.<\/p>\n<h2>Sorgu Planlar\u0131n\u0131 Anlamak: explain() Metodu ile Performans\u0131 Nas\u0131l Analiz Edersiniz?<\/h2>\n<p>MongoDB&#8217;deki <code>explain()<\/code> metodu, bir sorgunun nas\u0131l y\u00fcr\u00fct\u00fcld\u00fc\u011f\u00fcn\u00fc, hangi indeksleri kulland\u0131\u011f\u0131n\u0131 ve genel olarak performans\u0131n\u0131 anlamak i\u00e7in paha bi\u00e7ilmez bir ara\u00e7t\u0131r. Bir sorgunun yava\u015f \u00e7al\u0131\u015ft\u0131\u011f\u0131n\u0131 fark etti\u011finizde, ilk yapman\u0131z gereken \u015feylerden biri <code>explain()<\/code> metodunu kullanarak sorgunun &#8220;sorgu plan\u0131n\u0131&#8221; incelemektir. Bu, sorgunun neden yava\u015f oldu\u011funu anlaman\u0131za ve uygun indeksleme stratejileriyle nas\u0131l iyile\u015ftirebilece\u011finize dair net bir yol haritas\u0131 sunar.<\/p>\n<p><code>explain()<\/code> metodu, \u00fc\u00e7 farkl\u0131 detay seviyesinde bilgi sa\u011flayabilir: <code>queryPlanner<\/code>, <code>executionStats<\/code> ve <code>allPlansExecution<\/code>. Her seviye, sorgunun y\u00fcr\u00fct\u00fclmesi hakk\u0131nda farkl\u0131 bir derinlikte bilgi sunar:<\/p>\n<ul>\n<li><strong><code>queryPlanner<\/code>:<\/strong> Bu mod, MongoDB&#8217;nin sorgu i\u00e7in se\u00e7ti\u011fi &#8220;kazanan&#8221; plan\u0131 ve neden di\u011fer planlar\u0131 reddetti\u011fini g\u00f6sterir. Hangi indekslerin g\u00f6z \u00f6n\u00fcnde bulunduruldu\u011funu ve hangisinin se\u00e7ildi\u011fini buradan g\u00f6rebilirsiniz. Ancak, sorgunun fiili y\u00fcr\u00fctme istatistiklerini i\u00e7ermez.<\/li>\n<li><strong><code>executionStats<\/code>:<\/strong> Bu mod, sorgunun fiili y\u00fcr\u00fctme istatistiklerini (\u00f6rne\u011fin, taranan belge say\u0131s\u0131, taranan indeks anahtar\u0131 say\u0131s\u0131, toplam y\u00fcr\u00fctme s\u00fcresi) i\u00e7erir. Bu, performans darbo\u011fazlar\u0131n\u0131 belirlemek i\u00e7in en s\u0131k kullan\u0131lan moddur ve bize <code>COLLSCAN<\/code> (t\u00fcm koleksiyonu tarama) m\u0131 yoksa <code>IXSCAN<\/code> (indeks taramas\u0131) m\u0131 yap\u0131ld\u0131\u011f\u0131n\u0131 g\u00f6sterir.<\/li>\n<li><strong><code>allPlansExecution<\/code>:<\/strong> En detayl\u0131 moddur. Hem <code>queryPlanner<\/code> hem de <code>executionStats<\/code> bilgilerini i\u00e7erir ve ayr\u0131ca MongoDB&#8217;nin sorgu i\u00e7in denedi\u011fi t\u00fcm olas\u0131 planlar\u0131n y\u00fcr\u00fctme istatistiklerini de g\u00f6sterir. Bu, \u00f6zellikle karma\u015f\u0131k sorgular i\u00e7in \u00e7ok say\u0131da indeks se\u00e7ene\u011fi oldu\u011funda faydal\u0131d\u0131r.<\/li>\n<\/ul>\n<p>Node.js&#8217;te, bir sorgunun <code>explain()<\/code> \u00e7\u0131kt\u0131s\u0131n\u0131 almak i\u00e7in <code>collection.find().explain()<\/code> metodunu kullanabilirsiniz. \u0130\u015fte bir \u00f6rnek:<\/p>\n<pre><code>\n      const { MongoClient } = require('mongodb');\n\n      async function analyzeQueryPerformance() {\n        const uri = \"mongodb:\/\/localhost:27017\";\n        const client = new MongoClient(uri);\n\n        try {\n          await client.connect();\n          const db = client.db(\"uygulamaDb\");\n          const collection = db.collection(\"urunler\");\n\n          \/\/ \u00d6rnek veri ekleme (e\u011fer koleksiyon bo\u015fsa)\n          \/\/ await collection.insertMany([\n          \/\/   { isim: \"Laptop\", kategori: \"Elektronik\", fiyat: 1200, stok: 50 },\n          \/\/   { isim: \"Klavye\", kategori: \"Elektronik\", fiyat: 75, stok: 200 },\n          \/\/   { isim: \"Fare\", kategori: \"Elektronik\", fiyat: 30, stok: 300 },\n          \/\/   { isim: \"Defter\", kategori: \"K\u0131rtasiye\", fiyat: 10, stok: 500 },\n          \/\/   { isim: \"Kalem\", kategori: \"K\u0131rtasiye\", fiyat: 5, stok: 1000 }\n          \/\/ ]);\n\n          \/\/ \u0130ndeks olmadan yava\u015f bir sorgu\n          console.log(\"--- \u0130ndeks Olmadan Sorgu Analizi ---\");\n          const explainResultNoIndex = await collection.find({ kategori: \"Elektronik\", fiyat: { $gt: 50 } }).explain(\"executionStats\");\n          console.log(explainResultNoIndex.executionStats);\n\n          \/\/ \u00c7\u0131kt\u0131da 'COLLSCAN' (Collection Scan) ve 'totalDocsExamined' ile 'totalKeysExamined' de\u011ferlerinin y\u00fcksek olmas\u0131 beklenir.\n\n          \/\/ \u015eimdi bir indeks olu\u015ftural\u0131m\n          await collection.createIndex({ kategori: 1, fiyat: 1 });\n          console.log(\"\\nKategori ve fiyat i\u00e7in bile\u015fik indeks olu\u015fturuldu.\");\n\n          \/\/ \u0130ndeks ile h\u0131zl\u0131 bir sorgu\n          console.log(\"--- \u0130ndeks \u0130le Sorgu Analizi ---\");\n          const explainResultWithIndex = await collection.find({ kategori: \"Elektronik\", fiyat: { $gt: 50 } }).explain(\"executionStats\");\n          console.log(explainResultWithIndex.executionStats);\n\n          \/\/ \u00c7\u0131kt\u0131da 'IXSCAN' (Index Scan) ve 'totalKeysExamined' de\u011ferinin 'totalDocsExamined' de\u011ferine g\u00f6re \u00e7ok daha d\u00fc\u015f\u00fck olmas\u0131 beklenir.\n          \/\/ 'winningPlan.inputStage.stage' alan\u0131nda 'IXSCAN' g\u00f6rmelisiniz.\n\n        } catch (error) {\n          console.error(\"Sorgu analizi s\u0131ras\u0131nda bir hata olu\u015ftu:\", error);\n        } finally {\n          await client.close();\n        }\n      }\n\n      analyzeQueryPerformance();\n    <\/code><\/pre>\n<p><code>explain()<\/code> \u00e7\u0131kt\u0131s\u0131n\u0131 incelerken dikkat etmeniz gereken baz\u0131 temel metrikler \u015funlard\u0131r:<\/p>\n<ul>\n<li><strong><code>winningPlan.inputStage.stage<\/code>:<\/strong> Bu alan, MongoDB&#8217;nin sorgu i\u00e7in kulland\u0131\u011f\u0131 ana i\u015flemi g\u00f6sterir. E\u011fer burada <code>COLLSCAN<\/code> g\u00f6r\u00fcyorsan\u0131z, MongoDB t\u00fcm koleksiyonu tar\u0131yor demektir ve bu genellikle indeks eksikli\u011finden kaynaklanan bir performans sorunudur. <code>IXSCAN<\/code> g\u00f6rmek ise, sorgunun bir indeksi verimli bir \u015fekilde kulland\u0131\u011f\u0131 anlam\u0131na gelir.<\/li>\n<li><strong><code>totalDocsExamined<\/code>:<\/strong> Sorgu taraf\u0131ndan incelenen toplam belge say\u0131s\u0131. Bu de\u011fer ne kadar d\u00fc\u015f\u00fckse, sorgu o kadar verimlidir.<\/li>\n<li><strong><code>totalKeysExamined<\/code>:<\/strong> Sorgu taraf\u0131ndan incelenen toplam indeks anahtar\u0131 say\u0131s\u0131. E\u011fer <code>totalDocsExamined<\/code> de\u011ferinden \u00e7ok daha d\u00fc\u015f\u00fckse, bu iyi bir indekse sahip oldu\u011funuzu g\u00f6sterir.<\/li>\n<li><strong><code>executionTimeMillis<\/code>:<\/strong> Sorgunun y\u00fcr\u00fct\u00fclmesi i\u00e7in ge\u00e7en toplam s\u00fcre (milisaniye cinsinden).<\/li>\n<li><strong><code>rejectedPlans<\/code>:<\/strong> MongoDB&#8217;nin denedi\u011fi ancak kazanan plan olarak se\u00e7medi\u011fi di\u011fer sorgu planlar\u0131. Bu, potansiyel olarak faydal\u0131 olabilecek ancak mevcut sorgu i\u00e7in optimize edilmemi\u015f indeksleri g\u00f6sterebilir.<\/li>\n<\/ul>\n<p>Vaka Analizi: Bir Node.js uygulamas\u0131nda, kullan\u0131c\u0131lar\u0131n sipari\u015flerini tarih aral\u0131\u011f\u0131na g\u00f6re filtreleyen bir raporlama sayfas\u0131n\u0131n yava\u015f \u00e7al\u0131\u015ft\u0131\u011f\u0131n\u0131 varsayal\u0131m. <code>explain(\"executionStats\")<\/code> \u00e7\u0131kt\u0131s\u0131na bakt\u0131\u011f\u0131n\u0131zda, <code>stage: \"COLLSCAN\"<\/code> ve \u00e7ok y\u00fcksek <code>totalDocsExamined<\/code> de\u011ferleri g\u00f6r\u00fcyorsunuz. Bu, veri taban\u0131n\u0131n her sipari\u015f belgesini tek tek tarad\u0131\u011f\u0131n\u0131 g\u00f6sterir. \u00c7\u00f6z\u00fcm olarak, <code>siparisTarihi: 1<\/code> \u00fczerinde bir indeks olu\u015fturursunuz. \u0130ndeks olu\u015fturulduktan sonra ayn\u0131 sorguyu tekrar <code>explain()<\/code> ile analiz etti\u011finizde, <code>stage: \"IXSCAN\"<\/code> ve \u00e7ok daha d\u00fc\u015f\u00fck <code>totalDocsExamined<\/code> ile <code>totalKeysExamined<\/code> de\u011ferleri g\u00f6r\u00fcrs\u00fcn\u00fcz. Bu, sorgunuzun art\u0131k indeksi kullanarak \u00e7ok daha h\u0131zl\u0131 \u00e7al\u0131\u015ft\u0131\u011f\u0131 anlam\u0131na gelir. <code>explain()<\/code> metodu, indeksleme stratejilerinizi geli\u015ftirirken ve performans sorunlar\u0131n\u0131 giderirken en g\u00fc\u00e7l\u00fc m\u00fcttefiklerinizden biridir.<\/p>\n<h2>Ger\u00e7ek D\u00fcnya Senaryolar\u0131: Node.js Uygulamalar\u0131nda \u0130ndeks Optimizasyonu<\/h2>\n<p>Teorik bilgileri ger\u00e7ek d\u00fcnya \u00f6rnekleriyle peki\u015ftirmek, indekslerin g\u00fcc\u00fcn\u00fc ve Node.js uygulamalar\u0131n\u0131zda nas\u0131l fark yaratabilece\u011fini daha iyi anlaman\u0131za yard\u0131mc\u0131 olacakt\u0131r. \u0130\u015fte farkl\u0131 uygulama t\u00fcrleri i\u00e7in indeks optimizasyon senaryolar\u0131:<\/p>\n<h3>E-ticaret Sitesi \u0130\u00e7in \u00dcr\u00fcn Aramas\u0131: H\u0131zl\u0131 Kategori ve Fiyat Filtrelemesi<\/h3>\n<p>Bir e-ticaret sitesinde, kullan\u0131c\u0131lar genellikle \u00fcr\u00fcnleri kategoriye g\u00f6re filtreler ve ard\u0131ndan fiyata g\u00f6re artan veya azalan s\u0131rada s\u0131ralarlar. Bu, \u00e7ok yayg\u0131n bir sorgu desenidir ve performans a\u00e7\u0131s\u0131ndan kritik \u00f6neme sahiptir. E\u011fer y\u00fcz binlerce veya milyonlarca \u00fcr\u00fcn\u00fcn\u00fcz varsa ve bu sorgular indekslenmemi\u015fse, her sorgu t\u00fcm \u00fcr\u00fcn koleksiyonunu tarayarak saniyeler s\u00fcrebilir.<\/p>\n<p><strong>Senaryo:<\/strong> Kullan\u0131c\u0131lar &#8220;Elektronik&#8221; kategorisindeki \u00fcr\u00fcnleri g\u00f6rmek istiyor ve sonu\u00e7lar\u0131 fiyata g\u00f6re en d\u00fc\u015f\u00fckten en y\u00fckse\u011fe s\u0131ral\u0131yor.<\/p>\n<p><strong>\u00c7\u00f6z\u00fcm:<\/strong> Bu senaryo i\u00e7in en uygun indeks, <code>kategori<\/code> ve <code>fiyat<\/code> alanlar\u0131n\u0131 i\u00e7eren bir bile\u015fik indekstir. ESR kural\u0131na g\u00f6re, e\u015fitlik sorgusu (kategori) \u00f6nce, s\u0131ralama (fiyat) sonra gelmelidir.<\/p>\n<pre><code>\n      \/\/ Mongoose Schema \u00f6rne\u011fi\n      const mongoose = require('mongoose');\n      const UrunSchema = new mongoose.Schema({\n        isim: String,\n        kategori: String,\n        fiyat: Number,\n        stok: Number,\n        marka: String\n      });\n\n      \/\/ \u0130ndeksi tan\u0131mla\n      UrunSchema.index({ kategori: 1, fiyat: 1 }); \/\/ Kategoriye g\u00f6re artan, fiyata g\u00f6re artan\n\n      const Urun = mongoose.model('Urun', UrunSchema);\n\n      \/\/ Node.js sorgu \u00f6rne\u011fi\n      async function getUrunlerByKategoriAndFiyat(kategoriAdi, minFiyat = 0) {\n        try {\n          const urunler = await Urun.find({\n            kategori: kategoriAdi,\n            fiyat: { $gt: minFiyat }\n          }).sort({ fiyat: 1 }).limit(10); \/\/ Fiyata g\u00f6re s\u0131rala\n          console.log(<code class=\"language-\">Kategori: ${kategoriAdi}, Minimum Fiyat: ${minFiyat} olan \u00fcr\u00fcnler:<\/code>, urunler);\n          return urunler;\n        } catch (error) {\n          console.error(\"\u00dcr\u00fcn sorgulama hatas\u0131:\", error);\n        }\n      }\n\n      \/\/ getUrunlerByKategoriAndFiyat(\"Elektronik\", 50);\n    <\/code><\/pre>\n<p>Bu bile\u015fik indeks sayesinde, MongoDB \u00f6nce <code>kategori<\/code> alan\u0131n\u0131 kullanarak h\u0131zl\u0131ca &#8220;Elektronik&#8221; kategorisindeki \u00fcr\u00fcnleri bulacak, ard\u0131ndan bu subset i\u00e7indeki <code>fiyat<\/code> alan\u0131n\u0131 kullanarak s\u0131ralama i\u015flemini ger\u00e7ekle\u015ftirecektir. Bu, tam koleksiyon taramas\u0131 yapmaktan \u00e7ok daha h\u0131zl\u0131d\u0131r ve kullan\u0131c\u0131ya an\u0131nda sonu\u00e7lar sunar.<\/p>\n<h3>Sosyal Medya Ak\u0131\u015f\u0131: Kullan\u0131c\u0131 G\u00f6nderilerini Zaman Bazl\u0131 Getirme<\/h3>\n<p>Bir sosyal medya uygulamas\u0131nda, kullan\u0131c\u0131lar genellikle kendi profil sayfalar\u0131nda veya ana sayfalar\u0131nda en son g\u00f6nderilerini kronolojik s\u0131raya g\u00f6re g\u00f6rmek isterler. Bu, kullan\u0131c\u0131 kimli\u011fine g\u00f6re filtreleme ve g\u00f6nderi tarihine g\u00f6re azalan s\u0131rada s\u0131ralama gerektiren bir i\u015flemdir.<\/p>\n<p><strong>Senaryo:<\/strong> Belirli bir kullan\u0131c\u0131n\u0131n en son 20 g\u00f6nderisini h\u0131zl\u0131ca getirme.<\/p>\n<p><strong>\u00c7\u00f6z\u00fcm:<\/strong> Bu durumda, <code>kullaniciId<\/code> ve <code>createdAt<\/code> alanlar\u0131n\u0131 i\u00e7eren bir bile\u015fik indeks idealdir.<\/p>\n<pre><code>\n      \/\/ Mongoose Schema \u00f6rne\u011fi\n      const mongoose = require('mongoose');\n      const GonderiSchema = new mongoose.Schema({\n        kullaniciId: mongoose.Schema.Types.ObjectId,\n        icerik: String,\n        createdAt: { type: Date, default: Date.now }\n      });\n\n      \/\/ \u0130ndeksi tan\u0131mla\n      GonderiSchema.index({ kullaniciId: 1, createdAt: -1 }); \/\/ Kullan\u0131c\u0131 ID'ye g\u00f6re artan, tarihe g\u00f6re azalan\n\n      const Gonderi = mongoose.model('Gonderi', GonderiSchema);\n\n      \/\/ Node.js sorgu \u00f6rne\u011fi\n      async function getUserPosts(userId) {\n        try {\n          const posts = await Gonderi.find({ kullaniciId: userId })\n                                    .sort({ createdAt: -1 })\n                                    .limit(20);\n          console.log(<code class=\"language-\">Kullan\u0131c\u0131 ${userId} i\u00e7in son g\u00f6nderiler:<\/code>, posts);\n          return posts;\n        } catch (error) {\n          console.error(\"G\u00f6nderi sorgulama hatas\u0131:\", error);\n        }\n      }\n\n      \/\/ getUserPosts(new mongoose.Types.ObjectId(\"60c72b2f9b1e8b001c8e4d1a\")); \/\/ \u00d6rnek kullan\u0131c\u0131 ID\n    <\/code><\/pre>\n<p>Bu indeks, MongoDB&#8217;nin \u00f6nce <code>kullaniciId<\/code> alan\u0131n\u0131 kullanarak h\u0131zl\u0131ca ilgili kullan\u0131c\u0131n\u0131n g\u00f6nderilerini bulmas\u0131n\u0131, ard\u0131ndan <code>createdAt<\/code> alan\u0131n\u0131 kullanarak bu g\u00f6nderileri en yenisinden en eskisine do\u011fru s\u0131ralamas\u0131n\u0131 sa\u011flar. Bu, \u00f6zellikle milyonlarca g\u00f6nderi i\u00e7eren koleksiyonlarda sorgu performans\u0131n\u0131 b\u00fcy\u00fck \u00f6l\u00e7\u00fcde art\u0131r\u0131r.<\/p>\n<h3>Log Y\u00f6netim Sistemi: Eski Loglar\u0131 Otomatik Temizleme<\/h3>\n<p>Uygulamalar genellikle sistem olaylar\u0131n\u0131, hatalar\u0131 veya kullan\u0131c\u0131 etkile\u015fimlerini kaydetmek i\u00e7in loglar tutar. Bu log koleksiyonlar\u0131 zamanla \u00e7ok b\u00fcy\u00fcyebilir ve disk alan\u0131n\u0131 t\u00fcketebilir. Belirli bir s\u00fcreden eski loglar\u0131n otomatik olarak silinmesi, veri taban\u0131n\u0131n boyutunu y\u00f6netmek ve performans\u0131n\u0131 korumak i\u00e7in \u00f6nemlidir.<\/p>\n<p><strong>Senaryo:<\/strong> Uygulama loglar\u0131n\u0131 7 g\u00fcn sonra otomatik olarak veri taban\u0131ndan silme.<\/p>\n<p><strong>\u00c7\u00f6z\u00fcm:<\/strong> <code>createdAt<\/code> (olu\u015fturulma tarihi) alan\u0131 \u00fczerinde bir TTL (Time-To-Live) indeksi kullanmak bu i\u015f i\u00e7in m\u00fckemmeldir.<\/p>\n<pre><code>\n      \/\/ Mongoose Schema \u00f6rne\u011fi\n      const mongoose = require('mongoose');\n      const LogSchema = new mongoose.Schema({\n        mesaj: String,\n        seviye: String, \/\/ info, warn, error\n        createdAt: { type: Date, default: Date.now }\n      });\n\n      \/\/ TTL indeksi tan\u0131mla: 7 g\u00fcn = 7 * 24 * 60 * 60 = 604800 saniye\n      LogSchema.index({ createdAt: 1 }, { expireAfterSeconds: 604800 });\n\n      const Log = mongoose.model('Log', LogSchema);\n\n      \/\/ Log kayd\u0131 ekleme \u00f6rne\u011fi\n      async function addLog(message, level) {\n        try {\n          const newLog = new Log({ mesaj: message, seviye: level });\n          await newLog.save();\n          console.log(\"Yeni log kaydedildi:\", newLog);\n        } catch (error) {\n          console.error(\"Log kaydetme hatas\u0131:\", error);\n        }\n      }\n\n      \/\/ addLog(\"Kullan\u0131c\u0131 giri\u015f yapt\u0131\", \"info\");\n    <\/code><\/pre>\n<p>Bu TTL indeksi sayesinde, MongoDB arka planda otomatik olarak <code>createdAt<\/code> alan\u0131 7 g\u00fcnden daha eski olan log belgelerini siler. Bu, manuel temizleme scriptleri yazma ve \u00e7al\u0131\u015ft\u0131rma ihtiyac\u0131n\u0131 ortadan kald\u0131r\u0131r, veri taban\u0131n\u0131n s\u00fcrekli optimize edilmesini sa\u011flar ve disk alan\u0131 kullan\u0131m\u0131n\u0131 kontrol alt\u0131nda tutar. Bu ger\u00e7ek d\u00fcnya senaryolar\u0131, do\u011fru indeksleme stratejilerinin Node.js uygulamalar\u0131n\u0131z\u0131n performans\u0131n\u0131 nas\u0131l k\u00f6kten de\u011fi\u015ftirebilece\u011fini g\u00f6stermektedir. Her zaman uygulaman\u0131z\u0131n sorgu desenlerini analiz edin ve bu desenlere en uygun indeksleri olu\u015fturmaya odaklan\u0131n.<\/p>\n<h2>\u0130leri D\u00fczey \u0130ndeks \u0130pu\u00e7lar\u0131 ve En \u0130yi Uygulamalar<\/h2>\n<p>MongoDB indeksleme, temel kullan\u0131mlar\u0131n \u00f6tesine ge\u00e7en bir\u00e7ok ileri d\u00fczey \u00f6zelli\u011fe sahiptir. Bu ipu\u00e7lar\u0131, daha karma\u015f\u0131k senaryolarda performans optimizasyonunu daha da derinle\u015ftirmenize yard\u0131mc\u0131 olacakt\u0131r. Ayr\u0131ca, genel olarak indeksleme stratejilerinizi geli\u015ftirmeniz i\u00e7in en iyi uygulamalar\u0131 da ele alaca\u011f\u0131z.<\/p>\n<h3>K\u0131smi \u0130ndeksler (Partial Indexes): Daha Az Maliyetle Daha Fazla Performans<\/h3>\n<p>K\u0131smi indeksler, yaln\u0131zca belirli bir filtre ko\u015fulunu kar\u015f\u0131layan belgeler \u00fczerinde indeks olu\u015fturman\u0131za olanak tan\u0131r. Bu, indeksin boyutunu \u00f6nemli \u00f6l\u00e7\u00fcde azaltabilir ve yazma performans maliyetini d\u00fc\u015f\u00fcrebilir, \u00e7\u00fcnk\u00fc indeks yaln\u0131zca ilgili belgeler i\u00e7in g\u00fcncellenir. \u00d6rne\u011fin, bir kullan\u0131c\u0131 koleksiyonunuz varsa ve yaln\u0131zca &#8220;aktif&#8221; durumdaki kullan\u0131c\u0131lar \u00fczerinde s\u0131k\u00e7a sorgu yap\u0131yorsan\u0131z, t\u00fcm kullan\u0131c\u0131lar yerine sadece aktif kullan\u0131c\u0131lar i\u00e7in bir indeks olu\u015fturabilirsiniz.<\/p>\n<pre><code>\n      db.kullanicilar.createIndex(\n        { email: 1 },\n        { partialFilterExpression: { status: \"active\" } }\n      );\n    <\/code><\/pre>\n<p>Bu indeks, yaln\u0131zca <code>status<\/code> alan\u0131 &#8220;active&#8221; olan belgeler i\u00e7in <code>email<\/code> alan\u0131 \u00fczerinde bir indeks olu\u015fturur. Bu, disk alan\u0131ndan tasarruf etmenizi ve indeksin g\u00fcncellenmesi gereken belge say\u0131s\u0131n\u0131 azaltman\u0131z\u0131 sa\u011flar.<\/p>\n<h3>Benzersiz \u0130ndeksler (Unique Indexes): Veri B\u00fct\u00fcnl\u00fc\u011f\u00fcn\u00fc Sa\u011flama<\/h3>\n<p>Benzersiz indeksler, indekslenen alan\u0131n veya alanlar\u0131n her belgede benzersiz olmas\u0131n\u0131 garanti eder. Bu, veri b\u00fct\u00fcnl\u00fc\u011f\u00fcn\u00fc sa\u011flamak i\u00e7in kritik \u00f6neme sahiptir. \u00d6rne\u011fin, bir kullan\u0131c\u0131n\u0131n e-posta adresinin veri taban\u0131nda yaln\u0131zca bir kez bulunmas\u0131n\u0131 sa\u011flamak i\u00e7in <code>email<\/code> alan\u0131 \u00fczerinde benzersiz bir indeks olu\u015fturabilirsiniz. E\u011fer benzersizlik kural\u0131n\u0131 ihlal eden bir belge eklemeye \u00e7al\u0131\u015f\u0131rsan\u0131z, MongoDB bir hata d\u00f6nd\u00fcr\u00fcr.<\/p>\n<pre><code>\n      db.kullanicilar.createIndex(\n        { email: 1 },\n        { unique: true }\n      );\n    <\/code><\/pre>\n<p>Bile\u015fik indeksler \u00fczerinde de benzersizlik k\u0131s\u0131tlamas\u0131 uygulayabilirsiniz. Bu durumda, t\u00fcm bile\u015fik indeksin de\u011feri benzersiz olmal\u0131d\u0131r.<\/p>\n<h3>\u0130nce \u0130ndeksleme (Covered Queries): Performans\u0131n Zirvesi<\/h3>\n<p>\u0130nce indeksleme, bir sorgunun yaln\u0131zca indeksi kullanarak t\u00fcm gerekli bilgileri alabilece\u011fi ve orijinal belgelere eri\u015fmek zorunda kalmad\u0131\u011f\u0131 durumlarda ortaya \u00e7\u0131kar. Bu, sorgu performans\u0131n\u0131n m\u00fcmk\u00fcn olan en y\u00fcksek seviyesidir, \u00e7\u00fcnk\u00fc MongoDB&#8217;nin diskten belge okumas\u0131na gerek kalmaz. Bir sorgunun ince indeksli olabilmesi i\u00e7in \u015fu ko\u015fullar\u0131 sa\u011flamas\u0131 gerekir:<\/p>\n<ol>\n<li>Sorgunun t\u00fcm filtreleme ko\u015fullar\u0131 indeksin bir par\u00e7as\u0131 olmal\u0131d\u0131r.<\/li>\n<li>Sorgunun d\u00f6nd\u00fcrd\u00fc\u011f\u00fc t\u00fcm alanlar (projeksiyon) indeksin bir par\u00e7as\u0131 olmal\u0131d\u0131r.<\/li>\n<li>Sorguda hi\u00e7bir alan indeksin bir par\u00e7as\u0131 olmayan bir diziyi i\u00e7ermemelidir.<\/li>\n<\/ol>\n<pre><code>\n      \/\/ \u0130ndeks: { kategori: 1, fiyat: 1 }\n      \/\/ \u0130nce indeksli sorgu \u00f6rne\u011fi:\n      db.urunler.find(\n        { kategori: \"Elektronik\", fiyat: { $gt: 100 } },\n        { kategori: 1, fiyat: 1, _id: 0 } \/\/ _id alan\u0131 her zaman dahil oldu\u011fu i\u00e7in hari\u00e7 tutulmal\u0131\n      );\n    <\/code><\/pre>\n<p>Bu sorgu, sadece <code>kategori<\/code> ve <code>fiyat<\/code> alanlar\u0131n\u0131 d\u00f6nd\u00fcrd\u00fc\u011f\u00fc ve bu alanlar indekste yer ald\u0131\u011f\u0131 i\u00e7in ince indeksli olacakt\u0131r.<\/p>\n<h3>Arka Plan \u0130ndeks Olu\u015fturma (Background Index Creation): Canl\u0131 Sistemlerde G\u00fcvenli \u0130ndeksleme<\/h3>\n<p>B\u00fcy\u00fck koleksiyonlar \u00fczerinde indeks olu\u015fturmak, veri taban\u0131n\u0131 ge\u00e7ici olarak bloklayabilir ve canl\u0131 uygulaman\u0131z\u0131n yan\u0131t s\u00fcrelerini etkileyebilir. MongoDB 4.2&#8217;den \u00f6nceki s\u00fcr\u00fcmlerde, indeksleri arka planda olu\u015fturmak i\u00e7in <code>{ background: true }<\/code> se\u00e7ene\u011fini kullanmak yayg\u0131n bir uygulamayd\u0131. Bu, indeks olu\u015fturma i\u015fleminin veri taban\u0131 i\u015flemlerini bloklamadan paralel olarak \u00e7al\u0131\u015fmas\u0131n\u0131 sa\u011flar. Ancak, MongoDB 4.2 ve sonraki s\u00fcr\u00fcmlerde, indeks olu\u015fturma varsay\u0131lan olarak arka planda \u00e7al\u0131\u015f\u0131r, bu nedenle bu se\u00e7ene\u011fi belirtmenize gerek kalmaz.<\/p>\n<pre><code>\n      \/\/ MongoDB 4.2+ s\u00fcr\u00fcmlerinde varsay\u0131lan olarak arka planda \u00e7al\u0131\u015f\u0131r\n      db.kullanicilar.createIndex({ ad: 1 });\n      \/\/ Eski s\u00fcr\u00fcmlerde: db.kullanicilar.createIndex({ ad: 1 }, { background: true });\n    <\/code><\/pre>\n<h3>\u0130ndeks Bak\u0131m\u0131 ve \u0130zleme<\/h3>\n<p>\u0130ndeksleme stratejiniz statik olmamal\u0131d\u0131r. Uygulaman\u0131z geli\u015ftik\u00e7e, veri desenleri de\u011fi\u015ftik\u00e7e veya yeni sorgular eklendik\u00e7e indekslerinizi g\u00f6zden ge\u00e7irmeniz gerekir. Kullan\u0131lmayan veya nadiren kullan\u0131lan indeksleri belirlemek ve silmek, disk alan\u0131ndan tasarruf etmenizi ve yazma performans\u0131n\u0131 art\u0131rman\u0131z\u0131 sa\u011flar. MongoDB Atlas gibi bulut servisleri veya <code>db.collection.stats()<\/code>, <code>db.collection.getIndexes()<\/code> gibi komutlar ile indeks kullan\u0131m\u0131n\u0131 ve istatistiklerini izleyebilirsiniz.<\/p>\n<h3>Shardlama ve \u0130ndeksler<\/h3>\n<p>B\u00fcy\u00fck \u00f6l\u00e7ekli da\u011f\u0131t\u0131k sistemlerde (sharded clusters), indeksleme stratejileri daha karma\u015f\u0131k hale gelir. Shard key (par\u00e7alama anahtar\u0131) se\u00e7imi, indeks performans\u0131n\u0131 do\u011frudan etkiler. Shard key, genellikle s\u0131k\u00e7a sorgulanan veya filtrelenen bir alan olmal\u0131d\u0131r ve iyi bir da\u011f\u0131l\u0131m sa\u011flamal\u0131d\u0131r. \u0130ndeksler, shard key \u00fczerinde veya shard key&#8217;i i\u00e7eren bile\u015fik indeksler olarak tan\u0131mlanmal\u0131d\u0131r.<\/p>\n<h3>Mobil Uyumluluk \u0130\u00e7in HTML Yap\u0131s\u0131<\/h3>\n<p>Makalenin temel konusu indeksler olsa da, modern web uygulamalar\u0131 geli\u015ftirirken mobil uyumluluk da g\u00f6z ard\u0131 edilemez. Node.js ile olu\u015fturdu\u011funuz API&#8217;ler ne kadar h\u0131zl\u0131 olursa olsun, kullan\u0131c\u0131 aray\u00fcz\u00fcn\u00fcz\u00fcn farkl\u0131 ekran boyutlar\u0131na uyum sa\u011flamas\u0131 \u00f6nemlidir. HTML yap\u0131n\u0131z\u0131 olu\u015ftururken semantik etiketler kullanmak ve esnek bir d\u00fczen olu\u015fturmak (\u00f6rne\u011fin, <code>div<\/code>&#8216;ler, <code>section<\/code>&#8216;lar kullanarak) responsive tasar\u0131m i\u00e7in temel olu\u015fturur. Bu HTML yap\u0131s\u0131, harici bir CSS dosyas\u0131 i\u00e7inde tan\u0131mlayaca\u011f\u0131n\u0131z medya sorgular\u0131 (<code>@media<\/code> kurallar\u0131) ile farkl\u0131 ekran boyutlar\u0131na (telefon, tablet, masa\u00fcst\u00fc) g\u00f6re otomatik olarak ayarlanabilir. \u00d6rne\u011fin, bir \u00fcr\u00fcn listesi i\u00e7in kulland\u0131\u011f\u0131n\u0131z <code>&lt;div class=\"urun-listesi\"&gt;<\/code> ve i\u00e7indeki <code>&lt;div class=\"urun-karti\"&gt;<\/code> elementleri, k\u00fc\u00e7\u00fck ekranlarda tek s\u00fctun, b\u00fcy\u00fck ekranlarda ise \u00e7oklu s\u00fctun olarak g\u00f6sterilmek \u00fczere CSS medya sorgular\u0131 ile hedeflenebilir. Bu sayede, uygulaman\u0131z\u0131n performans\u0131 kadar, kullan\u0131c\u0131 deneyimi de mobil cihazlarda optimize edilmi\u015f olur.<\/p>\n<pre><code>\n      &lt;div class=\"container\"&gt;\n        &lt;div class=\"header\"&gt;Ba\u015fl\u0131k&lt;\/div&gt;\n        &lt;div class=\"main-content\"&gt;\n          &lt;div class=\"sidebar\"&gt;Yan Men\u00fc&lt;\/div&gt;\n          &lt;div class=\"article-list\"&gt;\n            &lt;div class=\"article-card\"&gt;Makale 1&lt;\/div&gt;\n            &lt;div class=\"article-card\"&gt;Makale 2&lt;\/div&gt;\n          &lt;\/div&gt;\n        &lt;\/div&gt;\n        &lt;div class=\"footer\"&gt;Alt Bilgi&lt;\/div&gt;\n      &lt;\/div&gt;\n    <\/code><\/pre>\n<p>Yukar\u0131daki gibi bir HTML yap\u0131s\u0131, CSS medya sorgular\u0131 ile kolayca mobil uyumlu hale getirilebilir. \u00d6rne\u011fin, k\u00fc\u00e7\u00fck ekranlarda <code>.sidebar<\/code> gizlenebilir ve <code>.article-card<\/code>&#8216;lar tam geni\u015flikte g\u00f6sterilebilirken, b\u00fcy\u00fck ekranlarda yan men\u00fc g\u00f6r\u00fcn\u00fcr hale getirilebilir ve makale kartlar\u0131 yan yana dizilebilir. Bu, uygulaman\u0131z\u0131n hem performans hem de kullan\u0131labilirlik a\u00e7\u0131s\u0131ndan eksiksiz olmas\u0131n\u0131 sa\u011flar.<\/p>\n<h2>Sonu\u00e7: MongoDB \u0130ndeksleri ile Uygulaman\u0131z\u0131 Bir \u00dcst Seviyeye Ta\u015f\u0131y\u0131n<\/h2>\n<p>Bu makale boyunca, MongoDB indekslerinin Node.js uygulamalar\u0131n\u0131z\u0131n sorgu performans\u0131n\u0131 nas\u0131l k\u00f6kten de\u011fi\u015ftirebilece\u011fini detayl\u0131 bir \u015fekilde inceledik. \u0130ndekslerin sadece bir performans arac\u0131 olmaktan \u00f6te, veri b\u00fct\u00fcnl\u00fc\u011f\u00fcn\u00fc sa\u011flamak ve belirli veri y\u00f6netimi g\u00f6revlerini otomatikle\u015ftirmek i\u00e7in de kullan\u0131labilece\u011fini g\u00f6rd\u00fck. Tek alan indekslerinden bile\u015fik, TTL, text ve geospasyal indekslere kadar \u00e7e\u015fitli t\u00fcrleri ke\u015ffettik, her birinin kendine \u00f6zg\u00fc kullan\u0131m senaryolar\u0131n\u0131 ve avantajlar\u0131n\u0131 ele ald\u0131k. Node.js&#8217;in resmi driver&#8217;\u0131 ve Mongoose gibi pop\u00fcler ODM&#8217;ler arac\u0131l\u0131\u011f\u0131yla indeksleri nas\u0131l olu\u015fturaca\u011f\u0131n\u0131z\u0131 ve y\u00f6netece\u011finizi ad\u0131m ad\u0131m \u00f6\u011frendik.<\/p>\n<p>En \u00f6nemlisi, <code>explain()<\/code> metodunun g\u00fcc\u00fcn\u00fc ke\u015ffettik. Bu ara\u00e7 sayesinde, sorgular\u0131n\u0131z\u0131n arka planda nas\u0131l \u00e7al\u0131\u015ft\u0131\u011f\u0131n\u0131 analiz edebilir, potansiyel performans darbo\u011fazlar\u0131n\u0131 belirleyebilir ve indeksleme stratejilerinizi bilin\u00e7li kararlarla optimize edebilirsiniz. Ger\u00e7ek d\u00fcnya senaryolar\u0131, e-ticaret aramalar\u0131ndan sosyal medya ak\u0131\u015flar\u0131na ve log y\u00f6netimine kadar farkl\u0131 alanlarda indekslerin nas\u0131l somut faydalar sa\u011flad\u0131\u011f\u0131n\u0131 g\u00f6sterdi. Ayr\u0131ca, k\u0131smi indeksler, ince indeksleme ve indeks bak\u0131m\u0131 gibi ileri d\u00fczey ipu\u00e7lar\u0131yla, uygulaman\u0131z\u0131n performans\u0131n\u0131 daha da ileriye ta\u015f\u0131ma yollar\u0131n\u0131 ele ald\u0131k.<\/p>\n<p>Unutmay\u0131n, performans optimizasyonu sadece kod yazmaktan ibaret de\u011fildir; veri taban\u0131 seviyesindeki stratejiler de en az kod kalitesi kadar kritik \u00f6neme sahiptir. Do\u011fru indeksleme stratejileriyle, Node.js uygulaman\u0131z\u0131n MongoDB ile olan etkile\u015fimini h\u0131zland\u0131rabilir, kullan\u0131c\u0131lar\u0131n\u0131za daha ak\u0131c\u0131, daha duyarl\u0131 ve genel olarak daha iyi bir deneyim sunabilirsiniz. \u015eimdi s\u0131ra sizde! Kendi Node.js uygulamalar\u0131n\u0131zda bu bilgileri uygulamaya ba\u015flay\u0131n, sorgular\u0131n\u0131z\u0131 <code>explain()<\/code> ile analiz edin ve indekslerin g\u00fcc\u00fcn\u00fc ke\u015ffederek uygulaman\u0131z\u0131 bir \u00fcst seviyeye ta\u015f\u0131y\u0131n. Performans\u0131n zirvesine ula\u015fmak i\u00e7in do\u011fru indeksleme anahtard\u0131r.<\/p>\n<h3>S\u0131k\u00e7a Sorulan Sorular: \u0130ndeksler Hakk\u0131nda Merak Ettikleriniz<\/h3>\n<dl>\n<dt><strong>1. Her alana indeks eklemeli miyim?<\/strong><\/dt>\n<dd>Hay\u0131r, kesinlikle eklememelisiniz. \u0130ndeksler disk alan\u0131 kaplar ve her yazma (insert, update, delete) i\u015fleminde g\u00fcncellenmeleri gerekti\u011fi i\u00e7in yazma performans\u0131n\u0131 d\u00fc\u015f\u00fcr\u00fcrler. Yaln\u0131zca s\u0131k\u00e7a sorgulanan, filtrelenen, s\u0131ralanan veya benzersizlik k\u0131s\u0131tlamas\u0131 gerektiren alanlara indeks eklemelisiniz. Fazla indeks, faydadan \u00e7ok zarar getirebilir.<\/dd>\n<dt><strong>2. \u0130ndeksler sorgu performans\u0131n\u0131 her zaman art\u0131r\u0131r m\u0131?<\/strong><\/dt>\n<dd>\u00c7o\u011fu durumda evet, ancak her zaman de\u011fil. \u00c7ok k\u00fc\u00e7\u00fck veri k\u00fcmelerinde indeks kullanmak, indeksin kendisini okuma maliyeti nedeniyle bazen daha yava\u015f olabilir. Ayr\u0131ca, sorgunuz indeksi etkin bir \u015fekilde kullanam\u0131yorsa (\u00f6rne\u011fin, indeksin ba\u015flang\u0131\u00e7 alanlar\u0131n\u0131 i\u00e7ermiyorsa veya \u00e7ok karma\u015f\u0131k bir sorguysa), performans art\u0131\u015f\u0131 g\u00f6zlenmeyebilir. Bu nedenle, bir indeksi olu\u015fturduktan sonra <code>explain()<\/code> metodu ile sorgu plan\u0131n\u0131 kontrol etmek esast\u0131r.<\/dd>\n<dt><strong>3. Bile\u015fik indekslerde alanlar\u0131n s\u0131ras\u0131 \u00f6nemli mi?<\/strong><\/dt>\n<dd>Kesinlikle evet, alanlar\u0131n s\u0131ras\u0131 kritik \u00f6neme sahiptir. MongoDB, bile\u015fik indeksleri soldan sa\u011fa do\u011fru kullan\u0131r. En iyi performans i\u00e7in ESR (Equality, Sort, Range) kural\u0131n\u0131 takip etmelisiniz: E\u015fitlik ko\u015fuluyla filtrelenen alanlar\u0131 indeksin en ba\u015f\u0131na, ard\u0131ndan s\u0131ralama i\u00e7in kullan\u0131lan alanlar\u0131 ve son olarak aral\u0131k sorgular\u0131 i\u00e7in kullan\u0131lan alanlar\u0131 yerle\u015ftirmelisiniz. Sorgunuz, indeksin ba\u015ftaki alanlar\u0131n\u0131 i\u00e7ermiyorsa, indeksin tamam\u0131n\u0131 veya bir k\u0131sm\u0131n\u0131 kullanamayabilir.<\/dd>\n<dt><strong>4. \u00dcretim ortam\u0131nda indeks olu\u015fturmak g\u00fcvenli midir?<\/strong><\/dt>\n<dd>MongoDB 4.2 ve sonras\u0131 s\u00fcr\u00fcmlerde indeks olu\u015fturma varsay\u0131lan olarak arka planda \u00e7al\u0131\u015f\u0131r ve \u00e7o\u011fu durumda veri taban\u0131 i\u015flemlerini bloklamaz. Bu, indeks olu\u015fturma i\u015fleminin canl\u0131 sistemlerde g\u00fcvenli bir \u015fekilde yap\u0131lmas\u0131n\u0131 sa\u011flar. Ancak, \u00e7ok b\u00fcy\u00fck koleksiyonlarda veya eski MongoDB s\u00fcr\u00fcmlerinde indeks olu\u015fturma i\u015flemi hala kaynak yo\u011fun olabilir ve dikkatli bir \u015fekilde planlanmal\u0131d\u0131r. Her zaman \u00f6ncelikle test ortamlar\u0131nda denemeniz ve bak\u0131m pencerelerinde yapman\u0131z \u00f6nerilir.<\/dd>\n<dt><strong>5. \u0130ndeksler ne kadar disk alan\u0131 kaplar?<\/strong><\/dt>\n<dd>Bir indeksin kaplad\u0131\u011f\u0131 disk alan\u0131, indekslenen alan\u0131n veri t\u00fcr\u00fcne, indeksin benzersiz olup olmamas\u0131na, indekslenen belge say\u0131s\u0131na ve indeksin t\u00fcr\u00fcne (\u00f6rne\u011fin, text indeksler daha b\u00fcy\u00fck olabilir) ba\u011fl\u0131d\u0131r. Genellikle, indeksler ilgili koleksiyonun boyutunun bir k\u0131sm\u0131n\u0131 kaplar, ancak \u00e7ok say\u0131da indeks veya \u00e7ok b\u00fcy\u00fck alanlar\u0131n indekslenmesi bu oran\u0131 art\u0131rabilir. <code>db.collection.stats()<\/code> komutunu kullanarak bir koleksiyonun ve indekslerinin disk kullan\u0131m\u0131n\u0131 kontrol edebilirsiniz.<\/dd>\n<\/dl>\n<p><\/body><\/p>\n","protected":false},"excerpt":{"rendered":"MongoDB \u0130ndeksleri: Node.js ile Sorgu Performans\u0131n\u0131 Nas\u0131l \u0130yile\u015ftirirsiniz? MongoDB Sorgular\u0131n\u0131z Yava\u015f m\u0131 \u00c7al\u0131\u015f\u0131yor? Performans\u0131 Nas\u0131l Art\u0131r\u0131rs\u0131n\u0131z? MongoDB sorgu&hellip;","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"csco_page_header_type":"","csco_page_load_nextpost":"","csco_page_subscribe_form":"","csco_page_contact_form":"","footnotes":""},"categories":[676],"tags":[],"class_list":{"0":"post-41251","1":"post","2":"type-post","3":"status-publish","4":"format-standard","6":"category-mongodb","7":"cs-entry","8":"cs-video-wrap"},"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v20.5 (Yoast SEO v25.3.1) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>MongoDB Sorgular\u0131n\u0131z Yava\u015f m\u0131 \u00c7al\u0131\u015f\u0131yor? Performans\u0131 Nas\u0131l Art\u0131r\u0131rs\u0131n\u0131z?<\/title>\n<meta name=\"description\" content=\"MongoDB sorgu performans\u0131n\u0131 Node. js uygulamalar\u0131n\u0131zda optimize etmek mi istiyorsunuz?\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/fatihsoysal.com\/blog\/mongodb-sorgulariniz-yavas-mi-calisiyor-performansi-nasil-artirirsiniz\/\" \/>\n<meta property=\"og:locale\" content=\"tr_TR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"MongoDB Sorgular\u0131n\u0131z Yava\u015f m\u0131 \u00c7al\u0131\u015f\u0131yor? Performans\u0131 Nas\u0131l Art\u0131r\u0131rs\u0131n\u0131z?\" \/>\n<meta property=\"og:description\" content=\"MongoDB sorgu performans\u0131n\u0131 Node. js uygulamalar\u0131n\u0131zda optimize etmek mi istiyorsunuz?\" \/>\n<meta property=\"og:url\" content=\"https:\/\/fatihsoysal.com\/blog\/mongodb-sorgulariniz-yavas-mi-calisiyor-performansi-nasil-artirirsiniz\/\" \/>\n<meta property=\"og:site_name\" content=\"Kodlar\u0131n Gizemli D\u00fcnyas\u0131\" \/>\n<meta property=\"article:published_time\" content=\"2026-03-16T11:02:46+00:00\" \/>\n<meta name=\"author\" content=\"Fatih Soysal\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Yazan:\" \/>\n\t<meta name=\"twitter:data1\" content=\"Fatih Soysal\" \/>\n\t<meta name=\"twitter:label2\" content=\"Tahmini okuma s\u00fcresi\" \/>\n\t<meta name=\"twitter:data2\" content=\"33 dakika\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/mongodb-sorgulariniz-yavas-mi-calisiyor-performansi-nasil-artirirsiniz\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/mongodb-sorgulariniz-yavas-mi-calisiyor-performansi-nasil-artirirsiniz\/\"},\"author\":{\"name\":\"Fatih Soysal\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"headline\":\"MongoDB Sorgular\u0131n\u0131z Yava\u015f m\u0131 \u00c7al\u0131\u015f\u0131yor? Performans\u0131 Nas\u0131l Art\u0131r\u0131rs\u0131n\u0131z?\",\"datePublished\":\"2026-03-16T11:02:46+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/mongodb-sorgulariniz-yavas-mi-calisiyor-performansi-nasil-artirirsiniz\/\"},\"wordCount\":5272,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"articleSection\":[\"MongoDB\"],\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/mongodb-sorgulariniz-yavas-mi-calisiyor-performansi-nasil-artirirsiniz\/#respond\"]}],\"copyrightYear\":\"2026\",\"copyrightHolder\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/mongodb-sorgulariniz-yavas-mi-calisiyor-performansi-nasil-artirirsiniz\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/mongodb-sorgulariniz-yavas-mi-calisiyor-performansi-nasil-artirirsiniz\/\",\"name\":\"MongoDB Sorgular\u0131n\u0131z Yava\u015f m\u0131 \u00c7al\u0131\u015f\u0131yor? Performans\u0131 Nas\u0131l Art\u0131r\u0131rs\u0131n\u0131z?\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\"},\"datePublished\":\"2026-03-16T11:02:46+00:00\",\"description\":\"MongoDB sorgu performans\u0131n\u0131 Node. js uygulamalar\u0131n\u0131zda optimize etmek mi istiyorsunuz?\",\"breadcrumb\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/mongodb-sorgulariniz-yavas-mi-calisiyor-performansi-nasil-artirirsiniz\/#breadcrumb\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/mongodb-sorgulariniz-yavas-mi-calisiyor-performansi-nasil-artirirsiniz\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/mongodb-sorgulariniz-yavas-mi-calisiyor-performansi-nasil-artirirsiniz\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Anasayfa\",\"item\":\"https:\/\/fatihsoysal.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"MongoDB Sorgular\u0131n\u0131z Yava\u015f m\u0131 \u00c7al\u0131\u015f\u0131yor? Performans\u0131 Nas\u0131l Art\u0131r\u0131rs\u0131n\u0131z?\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/\",\"name\":\"Fatihsoysal.com\",\"description\":\"Blog - Yaz\u0131l\u0131m D\u00fcnyas\u0131 Tecr\u00fcbelerim\",\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/fatihsoysal.com\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"tr\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\",\"name\":\"Fatih Soysal\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"tr\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png\",\"contentUrl\":\"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png\",\"width\":512,\"height\":512,\"caption\":\"Fatih Soysal\"},\"logo\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/\"},\"description\":\"Kullan\u0131m ve kodlama m\u00fckemmeliyetini odak alan uygulamalar olu\u015fturma deneyimine sahip, profesyonel olarak 15+ y\u0131l \u00fczeri deneyime sahip bir yaz\u0131l\u0131m m\u00fchendisi.\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/author\/fatihsoysal\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"MongoDB Sorgular\u0131n\u0131z Yava\u015f m\u0131 \u00c7al\u0131\u015f\u0131yor? Performans\u0131 Nas\u0131l Art\u0131r\u0131rs\u0131n\u0131z?","description":"MongoDB sorgu performans\u0131n\u0131 Node. js uygulamalar\u0131n\u0131zda optimize etmek mi istiyorsunuz?","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/fatihsoysal.com\/blog\/mongodb-sorgulariniz-yavas-mi-calisiyor-performansi-nasil-artirirsiniz\/","og_locale":"tr_TR","og_type":"article","og_title":"MongoDB Sorgular\u0131n\u0131z Yava\u015f m\u0131 \u00c7al\u0131\u015f\u0131yor? Performans\u0131 Nas\u0131l Art\u0131r\u0131rs\u0131n\u0131z?","og_description":"MongoDB sorgu performans\u0131n\u0131 Node. js uygulamalar\u0131n\u0131zda optimize etmek mi istiyorsunuz?","og_url":"https:\/\/fatihsoysal.com\/blog\/mongodb-sorgulariniz-yavas-mi-calisiyor-performansi-nasil-artirirsiniz\/","og_site_name":"Kodlar\u0131n Gizemli D\u00fcnyas\u0131","article_published_time":"2026-03-16T11:02:46+00:00","author":"Fatih Soysal","twitter_card":"summary_large_image","twitter_misc":{"Yazan:":"Fatih Soysal","Tahmini okuma s\u00fcresi":"33 dakika"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/fatihsoysal.com\/blog\/mongodb-sorgulariniz-yavas-mi-calisiyor-performansi-nasil-artirirsiniz\/#article","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/mongodb-sorgulariniz-yavas-mi-calisiyor-performansi-nasil-artirirsiniz\/"},"author":{"name":"Fatih Soysal","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"headline":"MongoDB Sorgular\u0131n\u0131z Yava\u015f m\u0131 \u00c7al\u0131\u015f\u0131yor? Performans\u0131 Nas\u0131l Art\u0131r\u0131rs\u0131n\u0131z?","datePublished":"2026-03-16T11:02:46+00:00","mainEntityOfPage":{"@id":"https:\/\/fatihsoysal.com\/blog\/mongodb-sorgulariniz-yavas-mi-calisiyor-performansi-nasil-artirirsiniz\/"},"wordCount":5272,"commentCount":0,"publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"articleSection":["MongoDB"],"inLanguage":"tr","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/fatihsoysal.com\/blog\/mongodb-sorgulariniz-yavas-mi-calisiyor-performansi-nasil-artirirsiniz\/#respond"]}],"copyrightYear":"2026","copyrightHolder":{"@id":"https:\/\/fatihsoysal.com\/blog\/#organization"}},{"@type":"WebPage","@id":"https:\/\/fatihsoysal.com\/blog\/mongodb-sorgulariniz-yavas-mi-calisiyor-performansi-nasil-artirirsiniz\/","url":"https:\/\/fatihsoysal.com\/blog\/mongodb-sorgulariniz-yavas-mi-calisiyor-performansi-nasil-artirirsiniz\/","name":"MongoDB Sorgular\u0131n\u0131z Yava\u015f m\u0131 \u00c7al\u0131\u015f\u0131yor? Performans\u0131 Nas\u0131l Art\u0131r\u0131rs\u0131n\u0131z?","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/#website"},"datePublished":"2026-03-16T11:02:46+00:00","description":"MongoDB sorgu performans\u0131n\u0131 Node. js uygulamalar\u0131n\u0131zda optimize etmek mi istiyorsunuz?","breadcrumb":{"@id":"https:\/\/fatihsoysal.com\/blog\/mongodb-sorgulariniz-yavas-mi-calisiyor-performansi-nasil-artirirsiniz\/#breadcrumb"},"inLanguage":"tr","potentialAction":[{"@type":"ReadAction","target":["https:\/\/fatihsoysal.com\/blog\/mongodb-sorgulariniz-yavas-mi-calisiyor-performansi-nasil-artirirsiniz\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/fatihsoysal.com\/blog\/mongodb-sorgulariniz-yavas-mi-calisiyor-performansi-nasil-artirirsiniz\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Anasayfa","item":"https:\/\/fatihsoysal.com\/blog\/"},{"@type":"ListItem","position":2,"name":"MongoDB Sorgular\u0131n\u0131z Yava\u015f m\u0131 \u00c7al\u0131\u015f\u0131yor? Performans\u0131 Nas\u0131l Art\u0131r\u0131rs\u0131n\u0131z?"}]},{"@type":"WebSite","@id":"https:\/\/fatihsoysal.com\/blog\/#website","url":"https:\/\/fatihsoysal.com\/blog\/","name":"Fatihsoysal.com","description":"Blog - Yaz\u0131l\u0131m D\u00fcnyas\u0131 Tecr\u00fcbelerim","publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/fatihsoysal.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"tr"},{"@type":["Person","Organization"],"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1","name":"Fatih Soysal","image":{"@type":"ImageObject","inLanguage":"tr","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/","url":"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png","contentUrl":"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png","width":512,"height":512,"caption":"Fatih Soysal"},"logo":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/"},"description":"Kullan\u0131m ve kodlama m\u00fckemmeliyetini odak alan uygulamalar olu\u015fturma deneyimine sahip, profesyonel olarak 15+ y\u0131l \u00fczeri deneyime sahip bir yaz\u0131l\u0131m m\u00fchendisi.","url":"https:\/\/fatihsoysal.com\/blog\/author\/fatihsoysal\/"}]}},"yoast_meta":{"yoast_wpseo_title":"","yoast_wpseo_metadesc":"","yoast_wpseo_canonical":""},"amp_enabled":true,"_links":{"self":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/41251","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/comments?post=41251"}],"version-history":[{"count":0,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/41251\/revisions"}],"wp:attachment":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/media?parent=41251"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/categories?post=41251"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/tags?post=41251"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}