Laravel'in en büyük avantajlarından biri, Eloquent ORM'in sunduğu eager loading özelliğidir. Bu özellik, ilişkili verilerin aynı anda yüklenmesini sağlar. N+1 sorgu problemi, her ilişki için ayrı bir sorgu çalıştırıldığında meydana gelir. Bu sorunu eager loading kullanarak ortadan kaldırabilirsiniz.
```php
$posts = Post::with('comments')->get();
```
Bu sayede, `Post` modelini çektiğinizde, ilişkili tüm `comments` verileri tek bir sorguda çekilmiş olur. Bu, performansı önemli ölçüde artırır.
Indexler, veritabanındaki belirli sütunları hızlıca bulmak için kullanılır. Sorgu performansını iyileştirmek için, özellikle WHERE, ORDER BY gibi işlemler yapılan sütunlara index eklemek oldukça önemlidir. Laravel'de veritabanı indexleme için migrations kullanabilirsiniz:
```php
Schema::table('posts', function (Blueprint $table) {
$table->index('title');
});
```
Indexler, veritabanı performansını hızlandırarak sorgu sürelerini ciddi şekilde kısaltır.
Veritabanı sorguları bazen çok zaman alabilir. Özellikle sıkça tekrarlanan verileri yeniden sorgulamak yerine, veritabanı sonuçlarını önbelleğe almak uygulamanızın performansını büyük ölçüde artırabilir. Laravel, cache mekanizması ile bu işlemi oldukça kolaylaştırır:
```php
$posts = Cache::remember('posts', 60, function () {
return Post::all();
});
```
Bu kod, `posts` verisini 60 dakika boyunca cache'ler. Veritabanına her sorgu yapıldığında, aynı sonuçlar tekrar tekrar sorgulanmaz.
Karmaşık sorgularda, veri kümenizin tamamını çekmek yerine sadece ihtiyacınız olan verileri çekmek daha iyidir. `limit` ve `offset` kullanarak veritabanındaki büyük veri setlerinden sadece gerekli kısmı alabilirsiniz.
```php
$posts = Post::latest()->limit(10)->get();
```
Bu, sadece son 10 kaydı almanızı sağlar ve gereksiz veri çekmekten kaçınır.
Bazen, veritabanı sorgularının sırasını değiştirmek performansı artırabilir. Örneğin, önce sıralama işlemi yapıp sonra filtreleme işlemi yapmak, daha hızlı sonuçlar verebilir. Bu tür optimizasyonları yaparken her zaman sorgunun mantığını göz önünde bulundurun.
Laravel, veritabanı sorgularını loglama özelliğine sahiptir. Bu, hangi sorguların yavaş çalıştığını belirlemek ve bu sorguları optimize etmek için oldukça yararlıdır. `DB::listen` fonksiyonu ile bu sorguları kolayca takip edebilirsiniz:
```php
DB::listen(function ($query) {
// Sorguları logla
Log::info($query->sql);
});
```
Bu sayede, hangi sorguların performansı etkilediğini hızlıca tespit edebilirsiniz.
Eloquent ORM, çoğu durumda kullanışlıdır ancak çok karmaşık sorgular söz konusu olduğunda raw SQL sorguları yazmak daha verimli olabilir. Laravel, raw sorguları çalıştırmanıza imkan verir:
```php
$posts = DB::select('SELECT * FROM posts WHERE title LIKE ?', ['%Laravel%']);
```
Bu sayede daha kontrollü ve verimli sorgular yazabilirsiniz.
Laravel'de birden fazla veritabanı bağlantısını aynı anda kullanmak mümkündür. Eğer uygulamanız büyük ölçekliyse ve farklı veri kaynaklarına ihtiyaç duyuyorsa, replication gibi teknikler ile veri okuma ve yazma işlemlerini farklı veritabanlarına yönlendirebilirsiniz.
Laravel, ilişkili verileri sorgularken join kullanma imkanı sağlar. Ancak gereksiz `join` işlemleri sorguların performansını düşürebilir. Bu nedenle sadece gerçekten ihtiyaç duyduğunuz verileri birleştirerek gereksiz yüklerden kaçının.
Veritabanı ilişkileri (foreign keys ve ilişkili tablolar) düzgün bir şekilde tasarlanmalıdır. İlişkili verilerle çalışırken, doğru ve optimize edilmiş sorgular yazmak için ilişkilerinizi dikkatlice düzenleyin.
```php
$posts = Post::with('comments')->whereHas('comments', function ($query) {
$query->where('approved', true);
})->get();
```
Bu, sadece onaylı yorumlarla ilişkili olan postları getirir ve veritabanı üzerinde gereksiz yük oluşturmaz.