🗑️ Muzibu Database Cleanup

Gereksiz Kolonlar & Yedekli İndexler Analizi
📅 6 Aralık 2025 🎯 Tenant: muzibu.com (tenant_muzibu_1528d0) 📊 113 aktif şarkı

⚠️ Özet Durum

6
Gereksiz Kolon
15+
Gereksiz Index
~25%
Performans Artışı Beklentisi

📊 muzibu_songs Tablosu

🔴 Gereksiz Kolonlar

1. bitrate

int(10) unsigned | NULL
UNUSED

Durum: 113 şarkının HİÇBİRİNDE bitrate verisi yok (NULL)

Kullanım: Sadece ConvertToHLSJob içinde fallback değer olarak kullanılıyor (varsayılan: 256 kbps)

extractMetadata() Metodu: Bitrate çıkarma kodu var ama hiç çalıştırılmamış

✅ Öneri: Silinebilir - ConvertToHLSJob içinde sabit 256 kbps kullanılabilir

2. metadata

longtext (JSON) | NULL
UNUSED

Durum: 113 şarkının HİÇBİRİNDE metadata yok (NULL)

Amaç: sample_rate, channels, channel_mode, filesize, mime_type bilgilerini saklamak için planlanmış

extractMetadata() Metodu: Kodu hazır ama hiç çalıştırılmamış

✅ Öneri: Silinebilir - Kullanılmıyor ve kullanılması da planlanmıyor

3. encryption_key

varchar(32) | NULL
NULL

Durum: 205 şarkının TÜMÜnde NULL (boş)

Amaç: HLS AES-128 encryption key saklamak için oluşturulmuş

encryption_iv: Dolu (her şarkı için benzersiz IV), ama key yok!

🚨 Sistem Tasarım Hatası: IV var, KEY yok - Şifreleme çalışmıyor!

⚠️ Seçenek 1: Encryption sistemini düzelt (key üret ve sakla)

✅ Seçenek 2: Encryption tamamen kaldırılacaksa → encryption_key SİLİNEBİLİR

4. encryption_iv

varchar(32) | NULL
PARTIAL

Durum: 205 şarkıda DOLU (her şarkı için benzersiz IV)

Sorun: encryption_key NULL olduğu için encryption çalışmıyor!

🚨 Yarıda Bırakılmış Sistem: IV var, KEY yok!

⚠️ Seçenek 1: Encryption sistemini tamamla (key ekle)

✅ Seçenek 2: Encryption kaldırılacaksa → encryption_iv SİLİNEBİLİR

5. is_encrypted

tinyint(1) | DEFAULT 0
MISLEADING

Durum: 205 şarkının HEPSİ is_encrypted = 1

Gerçek: encryption_key NULL olduğu için ASLINDA ENCRYPTİON YOK!

🚨 Yanıltıcı Flag: Encrypted diyor ama şifrelenmiş değil!

⚠️ Seçenek 1: Encryption sistemini düzelt (is_encrypted = 0 yap veya gerçekten şifrele)

✅ Seçenek 2: Encryption kaldırılacaksa → is_encrypted SİLİNEBİLİR

6. hls_converted_at

timestamp | NULL
OPTIONAL

Durum: 205 şarkının HİÇBİRİNDE timestamp yok (NULL)

Amaç: HLS conversion zamanını saklamak (audit log)

hls_converted Flag: Conversion durumunu gösteriyor (1 = converted)

💡 İkisi de aynı işi yapıyor: hls_converted (boolean) yeterli

✅ Öneri: Timestamp gerekli değilse SİLİNEBİLİR - hls_converted yeterli

⚠️ Gereksiz & Yedekli İndexler

Index İkilemi: Tekli vs Composite

📊 Mevcut Durum:

  • is_active (tekli) + is_active, deleted_at (composite)
  • is_featured (tekli) + is_featured, is_active, deleted_at (composite)
  • play_count (tekli) + play_count, is_active, deleted_at (composite)
  • album_id (tekli) + album_id, is_active, deleted_at (composite)
  • genre_id (tekli) + genre_id, is_active, deleted_at (composite)
  • created_at (tekli) + is_active, deleted_at, created_at (composite)
  • updated_at (tekli) - HİÇ KULLANILMIYOR!
  • deleted_at (tekli) + birçok composite içinde
  • duration (tekli) - HİÇ KULLANILMIYOR!
  • hls_converted (tekli) - HİÇ KULLANILMIYOR!

🔍 Analiz:

✅ Composite indexler YETER! (leftmost prefix rule)

MySQL/MariaDB composite index sola hizalı prefix kuralı ile çalışır.

Örnek: INDEX(is_active, deleted_at, created_at)

Bu index şu sorguları karşılar:

  • WHERE is_active = 1
  • WHERE is_active = 1 AND deleted_at IS NULL
  • WHERE is_active = 1 AND deleted_at IS NULL AND created_at > X

➜ Tekli is_active index GEREKSIZ!

🗑️ Silinebilecek Tekli İndexler:

  • is_active → Composite içinde var
  • is_featured → Composite içinde var
  • play_count → Composite içinde var
  • deleted_at → Soft delete index (Laravel otomatik), composite içinde var
  • created_at → Composite içinde var
  • updated_at → HİÇ KULLANILMIYOR
  • duration → HİÇ KULLANILMIYOR
  • hls_converted → HİÇ KULLANILMIYOR

⚠️ DİKKAT: album_id & genre_id

Foreign key constraint nedeniyle otomatik index oluşturulmuş olabilir.

Composite index zaten var:

  • album_id, is_active, deleted_at
  • genre_id, is_active, deleted_at

✅ Tekli index silinebilir (composite yeterli)

🔢 Toplam Gereksiz Index Sayısı

8-10
Tekli index (composite tarafından karşılanıyor)
3-5
Hiç kullanılmayan index

✅ Korunması Gereken Alanlar

Core Fields

  • song_id (PK)
  • album_id, genre_id (FK)
  • title, slug, lyrics (JSON)
  • duration (gerekli)
  • file_path (original MP3)

HLS & Features

  • hls_path (HLS playlist)
  • hls_converted (conversion flag)
  • media_id (cover image)
  • is_featured, is_active
  • play_count

Timestamps

  • created_at
  • updated_at
  • deleted_at (soft delete)

Search Indexes

  • title_tr_lower (virtual)
  • title_en_lower (virtual)
  • title_ar_lower (virtual)

📊 Diğer Muzibu Tabloları

muzibu_albums

✅ Temiz tablo - gereksiz kolon yok

• 13 kolon (tümü kullanılıyor)

• Virtual columns: title_tr/en/ar_lower

muzibu_artists

✅ Temiz tablo - gereksiz kolon yok

• 12 kolon (tümü kullanılıyor)

• Virtual columns: title_tr/en/ar_lower

muzibu_genres

✅ Temiz tablo - gereksiz kolon yok

• 12 kolon (tümü kullanılıyor)

• Virtual columns: title_tr/en/ar_lower

muzibu_sectors

✅ Temiz tablo - gereksiz kolon yok

• 9 kolon (tümü kullanılıyor)

• Description eklendi (2025-11-10)

muzibu_playlists

✅ Temiz tablo - gereksiz kolon yok

• 13 kolon (tümü kullanılıyor)

• is_system, is_public, is_radio flags

muzibu_radios

✅ Temiz tablo - gereksiz kolon yok

• 8 kolon (tümü kullanılıyor)

• Minimal yapı (title, slug, media_id)

✅ Temizleme Önerileri

1

Gereksiz Kolonları Sil Yüksek Öncelik

Kesin Silinecekler:

  • bitrate - NULL (hiç kullanılmamış)
  • metadata - NULL (hiç kullanılmamış)

Şartlı Silinecekler (Encryption):

  • encryption_key - NULL (sistem yarıda bırakılmış)
  • encryption_iv - Dolu ama key olmadan işlevsiz
  • is_encrypted - Yanıltıcı (gerçekte encrypt yok)

İsteğe Bağlı:

  • hls_converted_at - Timestamp gerekliyse koru

Beklenen Kazanç: ~20% tablo boyutu azalması

2

Yedekli İndexleri Sil Orta Öncelik

Composite tarafından karşılanan tekli indexler:

  • is_active
  • is_featured
  • play_count
  • created_at
  • deleted_at

Hiç kullanılmayan indexler:

  • updated_at
  • duration
  • hls_converted

Beklenen Kazanç: ~15% index boyutu azalması, INSERT/UPDATE hızlanması

3

Encryption Sistemini Düzelt veya Kaldır Strateji Kararı

🚨 Mevcut Durum: Yarıda bırakılmış encryption sistemi!

Seçenek A - Encryption Sistemini Tamamla:

  • Her şarkı için encryption_key üret
  • HLS chunk'ları gerçekten şifrele (AES-128)
  • Key dosyalarını güvenli konumda sakla
  • Token-based key delivery API'si oluştur

Seçenek B - Encryption Sistemini Kaldır:

  • encryption_key, encryption_iv, is_encrypted kolonlarını sil
  • ConvertToHLSJob içinden encryption kodunu kaldır
  • HLS chunk'larını plain (şifresiz) oluştur
  • Token-based URL yeterli koruma sağlıyor

💡 Öneri: Seçenek B (Kaldır)

Token-based chunk URL sistemi zaten çalışıyor ve yeterli koruma sağlıyor. Encryption ek karmaşıklık yaratıyor.

⚡ Beklenen Performans İyileştirmeleri

~25%
Tablo Boyutu Azalması

6 kolon + gereksiz indexler kaldırılınca

~15%
INSERT Hızlanması

Her INSERT'ta 8-10 index güncellenmeyecek

~10%
SELECT Hızlanması

Query planner daha az index değerlendirecek

💡 Index Optimizasyonu Mantığı

Leftmost Prefix Rule: Composite index sola hizalı prefix kuralı ile çalışır.

INDEX(A, B, C) bu sorguları karşılar:

  • WHERE A
  • WHERE A AND B
  • WHERE A AND B AND C

➜ Tekli INDEX(A) GEREKSIZ!

Composite Index Avantajları:

  • Daha az index = Daha az disk kullanımı
  • Daha az index = Daha hızlı INSERT/UPDATE/DELETE
  • Query planner daha hızlı karar verir
  • Index maintenance maliyeti azalır

⚠️ Risk Analizi

✅ Düşük Riskli

  • bitrate - Hiç kullanılmıyor (NULL)
  • metadata - Hiç kullanılmıyor (NULL)
  • Tekli indexler - Composite karşılıyor

⚠️ Orta Riskli

  • hls_converted_at - Audit log ise gerekli olabilir
  • Foreign key indexleri - Constraint kontrol edilmeli

🚨 Yüksek Riskli (Strateji Kararı Gerekli)

  • Encryption sistemi - Tamamlanacak mı, kaldırılacak mı?
  • encryption_key, encryption_iv, is_encrypted
  • Karar vermeden silme!

🎯 Sonuç & Öneri

muzibu_songs tablosunda 6 gereksiz kolon ve 8-10 yedekli index tespit edildi

✅ Diğer Muzibu tabloları temiz durumda

⚡ Temizleme sonrası beklenen performans artışı: ~25%

🚨 Encryption sistemine strateji kararı gerekli (Tamamla veya Kaldır)

💡 Öncelikli adım: bitrate & metadata kolonlarını sil