Veritabanı Sorgularını İyileştirme
N+1 sorgularını belirleyin, dizinler ekleyin ve sorgu sayısını azaltın.
Veritabanı Sorgularını İyileştirme, CoddyKit'te ücretsiz bir PHP Academy dersidir. Bu, 4 dersinin 3. dersidir. Aşağıdan dersin tamamını ücretsiz okuyabilir, sonra tarayıcıda yerleşik kod editörü ve 7/24 yapay zeka koçu ile uygulamalı olarak pratik yapabilirsin. Bu, PHP Academy öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. PHP Academy kursu toplamda 4 dersten oluşur.
Yavaş Sorguları Belirleme
MySQL yavaş sorgu günlüğünü etkinleştirip bir eşik belirleyiniz. Beklenenden uzun süren sorguları inceleyiniz.
# my.cnf:
slow_query_log = 1
slow_query_log_file = /var/log/mysql/slow.log
long_query_time = 0.5 # log queries over 500msEXPLAIN / EXPLAIN ANALYZE
MySQL'in bir sorguyu nasıl yürüttüğünü ve dizinlerin kullanılıp kullanılmadığını anlamak için EXPLAIN kullanınız.
-- Run in MySQL:
EXPLAIN SELECT * FROM orders WHERE user_id = 42 AND status = "pending";
-- Look for: type=ALL (full scan), key=NULL (no index used)Dizin Ekleme
Dizinler, filtrelenen ve sıralanan sütunlardaki okumaları büyük ölçüde hızlandırır.
-- Add composite index for the query above:
ALTER TABLE orders ADD INDEX idx_user_status (user_id, status);
// In Laravel migration:
$table->index(["user_id", "status"]);N+1 Sorgu Sorunu
N+1 sorunu, bir ilişki için listeyi almak üzere bir sorgu ve listedeki her öğe için bir sorgu çalıştırır. Eager loading kullanarak düzeltiniz.
<?php
// BAD: 1 + N queries
$posts = Post::all();
foreach ($posts as $post) echo $post->author->name;
// GOOD: 2 queries
$posts = Post::with("author")->get();
foreach ($posts as $post) echo $post->author->name;Yalnızca Gereken Sütunları Seçme
SELECT * kullanmaktan kaçınınız; bellek kullanımını ve ağ aktarımını azaltmak için yalnızca ihtiyacınız olan sütunları getiriniz.
<?php
// Bad:
$users = User::all();
// Good:
$users = User::select("id", "name", "email")->get();Büyük Veri Kümelerini Parçalara Ayırma
Bellek tükenmesini önlemek için büyük sonuç kümelerini parçalar hâlinde işleyiniz.
<?php
User::chunk(500, function ($users) {
foreach ($users as $user) {
// process each user
}
});
// Or lazy loading (PHP generator):
User::lazy()->each(fn($user) => processUser($user));Sorgu Önbelleğe Alma
Sık değişmeyen maliyetli toplama işlemlerini ve raporları önbelleğe alınız.
<?php
$revenue = Cache::remember("monthly-revenue", 3600, function () {
return Order::whereMonth("created_at", now()->month)->sum("total");
});Döngülerde Sorgulardan Kaçınma
foreach döngülerinin içinde hiçbir zaman sorgu çalıştırmayınız. Önce kimlikleri toplayıp ardından tek bir sorguda getiriniz.
<?php
// Collect all product IDs:
$ids = array_column($cartItems, "product_id");
// One query:
$products = Product::whereIn("id", $ids)->get()->keyBy("id");
foreach ($cartItems as $item) {
$product = $products[$item["product_id"]];
}Veritabanı Bağlantı Havuzu Kullanımı
PHP-FPM, her çalışan işlem için yeni bir PDO bağlantısı oluşturur. PgBouncer veya ProxySQL, bağlantı yükünü havuzlayarak veritabanının bağlantı ek yüküyle aşırı yüklenmesini önleyebilir.
Kapsayıcı Dizinler
Kapsayıcı bir dizin, bir sorguyu karşılamak için gereken tüm sütunları içerir; MySQL, ana tablodaki satırlara erişmeden sorguyu yalnızca dizinden yanıtlayabilir.
Özet
Yavaş sorgu günlüklerini etkinleştiriniz. Eksik dizinleri bulmak için EXPLAIN kullanınız. İlişkileri eager loading ile yükleyiniz. Yalnızca gereken sütunları seçiniz. Büyük veri kümelerini parçalara ayırınız. Maliyetli toplama işlemlerini önbelleğe alınız. Döngülerin içinde sorgu çalıştırmaktan kaçınınız.
Hızlı Kontrol
N+1 sorgu sorunu nedir?
Sıkça Sorulan Sorular
“Veritabanı Sorgularını İyileştirme” dersi ücretsiz mi?
Evet — “Veritabanı Sorgularını İyileştirme” dersin tüm metni burada web'de ücretsiz olarak okunabilir. Etkileşimli olarak pratik yapmak (yerleşik kod editörü ve 7/24 yapay zeka koçu) ve PHP Academy kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. PHP Academy kursu toplamda 4 dersten oluşur.
“Veritabanı Sorgularını İyileştirme” dersinde ne öğreneceğim?
N+1 sorgularını belirleyin, dizinler ekleyin ve sorgu sayısını azaltın. PHP Academy ile uygulamalı kodu tarayıcıda doğrudan çalıştırarak pratik yaparsın ve 7/24 yapay zeka koçu dersi çalışırken sorularını yanıtlar.
PHP Academy öğrenmeye başlamak için deneyim gerekli mi?
Önceden deneyim gerekmez. CoddyKit'te PHP Academy, başlangıçtan ileri seviyeye kadar yapılandırıldığı için buradan başlayabilir veya başından başlayıp kendi hızında ilerleme yapabilirsin. Bu, 4 dersinin 3. dersidir.
“Veritabanı Sorgularını İyileştirme” dersi ne kadar sürer?
Çoğu CoddyKit dersi yaklaşık 5–10 dakika sürer. Her biri kısa ve etkileşimli olduğu için sabit ilerleme yaparsın ve web ile uygulama arasında tam olarak bıraktığın yerden devam edebilirsin.
Bu PHP Academy dersinde kod yazıp çalıştırabilir miyim?
Evet. Her PHP Academy dersi yerleşik bir kod editörü içerir, bu sayede tarayıcıda gerçek kod yazıp çalıştırabilir ve anlık yapay zeka geri bildirimi alırsın — yerel kurulum gerekli değildir.
Bu kursun tüm dersleri
- Xdebug ile PHP Profilleme
- OPcache: Bayt Kodu Önbellekleme
- Veritabanı Sorgularını İyileştirme
- Bellek Yönetimi ve Performans İpuçları