Darboğaz: Büyük Ölçekli B2B Veri Setlerinde Şişkin İndeksler
<p>Smart Tech Devs'te büyük ölçekli B2B SaaS uygulamaları geliştirirken, standart <code>$table->index(['tenant_id', 'status'])</code> migrations'ın yeterli olmadığı bir noktaya ulaşıyoruz. <code>invoices</code> veya <code>activity_logs</code> tabloları milyonlarca veya milyarlarca satıra ulaştığında, genel indeksleme size karşı çalışmaya başlar. İndeksin kendisi devasa hale gelir (şişkin), aşırı RAM tüketir, yazma gecikmesini artırır (indeks her <code>INSERT</code> işleminde güncellenmek zorundadır) ve tam olarak optimize edilmesi gereken sorguların performansını düşürür.</p>
<p>Dayanıklı B2B performansı için en düşük ortak paydaları aşmalı ve PostgreSQL'e özgü gelişmiş özelliklerden yararlanmalıyız. *Hassas* indeksleme: Sadece sorguladığımız verileri *tam olarak* kapsayan ve daha fazlasını içermeyen indeksler oluşturmalıyız.</p>
<h2>Strateji 1: Kısmi İndeksler (Koşullu Veri Araması)</h2>
<p>Pek çok B2B sorgusu, aktif veya ilgili verilerin küçük bir alt kümesine odaklanır. Örneğin, bir faturalama modülünde, sorguların %95'i yalnızca mevcut mali yıl için "beklemede" veya "vadesi geçmiş" faturaları hedef alabilir. Diğer %5'lik kısım ise tarihsel sorgulamalardır.</p>
<p>Tüm 10 milyon faturayı indekslemek yerine, Kısmi İndeks PostgreSQL'e belirli bir <code>WHERE</code> koşulunu karşılayan satırlar için yalnızca bir indeks oluşturmasını söyler. Bu, küçük, yüksek performanslı bir indeks ile sonuçlanır.</p>
<h3>Pratik Senaryo: Aktif Kiracıları Filtreleme</h3>
<p>Kimlik doğrulama veya middleware yönlendirmeleri sırasında durumu kontrol etmek için ana <code>tenants</code> tablosunu sıkça sorguluyoruz. Ancak, yalnızca 'aktif' veya 'onboarding' kiracılara önem veriyoruz.</p>
<h3>Laravel Uygulaması ( `database/migrations/xxxx_create_partial_tenant_index.php` )</h3>
<p>Laravel standart indeks sözdizimini desteklese de, spesifik PostgreSQL koşullama ifadesini uygulamak için migration'da bir <code>DB::statement</code> kullanıyoruz.</p>
<pre><code>use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
use Illuminate\Support\Facades\DB;
class CreatePartialTenantIndex extends Migration
{
/
Run the migrations.
*/
public function up(): void
{
Schema::table(‘tenants’, function (Blueprint $table) {
// Temel sütunlar için standart migrations kullanıyoruz,
// ancak gelişmiş indeksler ham SQL ifadeleri gerektirir.
});// Kısmi İndeks için PostgreSQL Ham SQL
DB::statement(‘
CREATE INDEX tenants_active_lookup_partial_idx
ON tenants (id, domain)
WHERE status IN (\’active\’, \’onboarding\’)
‘);
}
/
* Reverse the migrations.
*/
public function down(): void
{
DB::statement('DROP INDEX tenants_active_lookup_partial_idx');
}}
<h2>Strateji 2: Fonksiyonel (İfade) İndeksler (Değişmez Veri Kısıtlamaları)</h2>
<p>Standart indeksler, sorgunun <code>WHERE</code> koşulunda indekslenmiş sütunlara fonksiyonlar uygulandığında başarısız olur. Klasik örnek büyük harf duyarsız arama, örneğin bir kullanıcının e-posta adresiyle sorgulanmasıdır.</p>
<pre><code>// Bu sorgu ’email’ sütunundaki standart indeksi devre dışı bırakır:
$user = User::whereRaw(‘LOWER(email) = ?’, [strtolower($request->email)])->first();
<p>PostgreSQL Fonksiyonel İndeksleri, bir ifadenin veya fonksiyonun sonucunu indekslememizi sağlar ve bu yaygın aramalar için performansı geri kazandırır.</p>
<h3>Pratik Senaryo: SaaS Alan Adı Aramalarını Standartlaştırma</h3>
<p>Çok kiracılı platformlarda, kiracılar alt alan adları veya alan adları ile sorgulanır ve bunlar benzersiz ve büyük harf duyarsız olmalıdır.</p>
<h3>Laravel Uygulaması ( `database/migrations/xxxx_create_functional_domain_index.php` )</h3>
<pre><code>use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
use Illuminate\Support\Facades\DB;
class CreateFunctionalDomainIndex extends Migration
{
/
- Run the migrations.
*/
public function up(): void
{
// Fonksiyonel/İfade İndeksi için PostgreSQL Ham SQL
// Bu, alan adının küçültülmüş sonucunu indeksler.
DB::statement(‘
CREATE UNIQUE INDEX tenants_domain_lower_unique_idx
ON tenants (LOWER(domain))
‘);
}
/
* Reverse the migrations.
*/
public function down(): void
{
DB::statement('DROP INDEX tenants_domain_lower_unique_idx');
}}
<h2>Dayanıklı Performans Avantajları</h2>
<p>Genel indekslemeden PostgreSQL hassas indekslemeye geçiş, ölçeklenebilir B2B mimarisi için zincirleme avantajlar sağlar:</p>
<ol>
<li>Önemli Derecede Küçük İndeks Boyutu: Kısmi indeksler genellikle tam tablo indekslerinden %90 daha küçük olabilmektedir, bu da değerli sunucu RAM’inden tasarruf sağlar ve kritik indeksleri bellekte önbellekte tutar.
INSERT ve UPDATE işlemleri daha hızlı gerçekleşir—PostgreSQL yalnızca satır kısmi koşulu karşılıyorsa indeksi güncellemek zorundadır.<h2>Sonuç</h2>
<p>Dayanıklı teknoloji ürünleri, dayanıklı veritabanı mimarileri üzerine inşa edilir. Büyük ölçekli B2B veri setlerini yönetirken, genel indeksleme çözümleri ölçeklenmeyi başaramaz. Laravel migrations aracılığıyla Kısmi ve Fonksiyonel İndeksler gibi gelişmiş PostgreSQL özelliklerini kullanmak, Smart Tech Devs'in performans optimizasyonunda cerrahi hassasiyeti korumasını sağlar ve platformlarımızın büyük veri yükü altında bile hızlı ve cevap verebilir olmalarını garanti eder.</p>Kaynak: Orijinal Makale


