İlişkisel Veritabanları Neden Önemli?
MySQL ve onun topluluk-driven çatalı MariaDB, dünya genelinde en çok kullanılan açık kaynak ilişkisel veritabanı yönetim sistemleridir. WordPress, Magento, Drupal, WHMCS, Joomla gibi sistemlerin omurgasında yer alırlar. AIOR olarak müşterilerimize hem MySQL 8 hem MariaDB 10.6+ sürümlerini sunuyoruz; her ikisi de ACID uyumlu, transaction destekli ve InnoDB depolama motoru ile sağlam veri bütünlüğü sağlar. Veritabanı bir uygulamanın kalbidir; doğru tasarım uygulamanın ömrünü uzatır, yanlış tasarım ise sürekli refactoring borcu yaratır.
İlişkisel modelin gücü, verilerin tablolar arasında belirli kurallarla ilişkilendirilmesinde yatar. Foreign key constraint''ler veri tutarlılığını veritabanı seviyesinde garanti eder; index''ler okuma performansını dramatik biçimde artırır. SQL standardının olgunluğu, geliştiricinin başka DBMS''e geçtiğinde dahi öğrendiği bilgilerin büyük kısmının taşınabilir olmasını sağlar. Modern MySQL 8 ile birlikte JSON column tipi, window functions, common table expressions (CTE) ve invisible indexes gibi NoSQL ve analitik özellikler eklendi.
Şema Tasarımı ve Normalleştirme
İyi şema tasarımı normalleştirme prensiplerinden başlar. 1NF, 2NF, 3NF formlarını uygulayarak tekrarlı veriyi tablolara ayırın; bu hem güncelleme anomalilerini önler hem de depolamayı optimize eder. Ancak normalleştirme dogmatik uygulanmaz: yüksek-okuma yüklü raporlama tabloları için kontrollü denormalizasyon (örn. müşteri adı + ürün adı''nı sipariş satırında saklamak) sorgu performansını ciddi artırır.
Veri tiplerini doğru seçin: ENUM tek bir kolonda sabit değerler için ideal, ancak schema değişikliği maliyetli — büyük tablo için lookup tablo daha esnek. DATETIME yerine zaman dilimini hesaba katan TIMESTAMP veya UTC bazlı BIGINT (epoch) tercih edilebilir. VARCHAR length seçimini dikkatli yapın; gerçek max boyutla uyumlu olsun. UUID PK''lar kullanışlı ama InnoDB clustered index için BIGINT auto_increment hâlâ tercih edilir.
Performansta Index ve Sorgu Optimizasyonu
Index, kitabın arka tarafındaki alfabetik dizine benzer. Doğru kolonlara index koyarsanız sorgular milisaniyelerde sonuçlanır; yanlış index yetersiz veya gereksizdir ve INSERT/UPDATE''i yavaşlatır. WHERE, JOIN ve ORDER BY''da kullanılan kolonlar index adayıdır. Birleşik (composite) index oluştururken kolon sırası önemlidir; en seçici kolon en başta olmalıdır. Covering index, sorgunun tüm kolonlarını index''ten karşılar ve tablo okumayı tamamen önler.
EXPLAIN deyimi MySQL''in sorguyu nasıl çalıştırdığını gösterir; type sütununda ALL görüyorsanız tam tablo taraması demektir — index ihtiyacının habercisidir. Slow query log''u etkinleştirip (long_query_time=1) uzun süren sorguları analiz edin. ORM''inizden çıkan N+1 problemini eager loading (with(), include()) ile çözün. Raporlama sorgularını materialised view veya geçici tablolarla optimize edin; analytical sorgular için MySQL 8''in window function''larından (ROW_NUMBER, RANK, LAG) faydalanın.
Yedekleme ve Felaket Kurtarma
Veri en kıymetli varlığınızdır. AIOR olarak günlük otomatik mysqldump yedekleri alıyor, bunları farklı sunucularda 7-30 gün saklıyoruz. Müşterilerimize ek olarak cPanel''den manuel yedek alma + indirme özelliği sunuyoruz. Büyük veritabanlarında (>5GB) Percona XtraBackup ile fiziksel yedek daha hızlı olur; mysqldump mantıksal yedektir ve geri yüklemesi daha uzun sürer. Binary log (binlog) ile point-in-time recovery (PITR) yapılabilir — son yedek sonrası belirli bir saniyeye kadar geri yükleme.
İyi bir 3-2-1 stratejisi: 3 kopya (asıl + 2 yedek), 2 farklı medya (disk + soğuk depolama), 1 offsite (farklı veri merkezi). Test geri yüklemesi yapmadan yedek almanın anlamı yoktur; ayda bir yedeği farklı bir sunucuya geri yükleyip bütünlüğünü doğrulayın. Replication (master-slave veya master-master) yedek değildir — yalnızca availability sağlar. Şifrelenmiş yedek için mysqldump | gpg --encrypt pipeline kullanın; rclone ile soğuk depolamaya gönderin.
Güvenlik ve Erişim Kontrolü
Veritabanı kullanıcıları en az ayrıcalık prensibiyle (least privilege) oluşturulmalıdır. Uygulama kullanıcısına yalnızca gerekli tablolarda SELECT/INSERT/UPDATE/DELETE verin; DROP, ALTER, GRANT vermeyin. Production uygulamaları root ile bağlanmamalıdır. Read-only raporlama servisleri için ayrı bir kullanıcı yaratın; bu kullanıcı SADECE SELECT yetkisine sahip olsun. MySQL 8''de role-based access control (RBAC) ile bu yetki yönetimi merkezileştirilebilir.
MySQL''i bind-address ile 127.0.0.1''e kilitleyin; uzak erişim gerekiyorsa SSH tunnel veya VPN üzerinden yapın. SSL/TLS bağlantısı zorunlu kılın (require_secure_transport=ON). Düzenli olarak mysql_secure_installation çalıştırın; anonymous user, test database, root remote login gibi varsayılan zafiyetleri kapatın. SQL injection''a karşı tek savunma prepared statements''tır; ORM kullansanız bile dinamik tablo/kolon adları whitelist edilmelidir.