Flutter mobil uygulama geliştirme projelerinde yerel veritabanı gecikmesini EXPLAIN QUERY PLAN, bileşik indeks, WAL ve ölçümlenebilir repository sınırlarıyla azaltmayı ele alıyoruz.
Flutter Mobil Uygulama Geliştirmede SQLite Sorgu Planı ve WAL
Flutter mobil uygulama geliştirmede önce sorgu maliyetini ölçün
SQL tarafında yalnızca toplam süreye bakmak yetersizdir. Drift kullanıyorsanız geliştirme derlemesinde customSelect ile EXPLAIN QUERY PLAN çalıştırın. Çıktıda SCAN orders görmek, SQLite'in tablonun tamamını gezdiğini; SEARCH orders USING INDEX ... görmek ise uygun bir indeks kullandığını gösterir. Özellikle 30 satır dönen bir sorgunun yine de 100.000 satır taraması, Dart'a az veri taşındığı için değil SQLite'in filtreye geç ulaştığı için pahalıdır.
final plan = await customSelect(
'EXPLAIN QUERY PLAN '
'SELECT id, total, created_at FROM orders '
'WHERE account_id = ? AND status = ? '
'ORDER BY created_at DESC LIMIT 50',
variables: [
Variable.withInt(accountId),
Variable.withString('open'),
],
).get();
for (final row in plan) {
debugPrint(row.data['detail'] as String);
}Bileşik indeks sırası: filtre ve sıralamayı birlikte tasarlayın
Değişiklikten önce ve sonra aynı cihaz sınıfında en az 30 tekrar yapın; ilk çalıştırmayı ayrı raporlayın çünkü sayfa önbelleği ısındığında sonuç değişir. Hedef, sorgu planında USE TEMP B-TREE FOR ORDER BY satırını kaldırmak ve örneğin p95 SQL süresini 48 ms'den 6 ms'ye indirmektir. İndeksin yazma maliyeti vardır: her INSERT ve indeksli alanı değiştiren UPDATE, indeks B-tree'sini de günceller. Bu nedenle yalnızca gerçek erişim kalıbına indeks ekleyin ve test veri kümesinde ANALYZE; çalıştırarak istatistikleri yenileyin.
WAL ile okuma-yazma çakışmasını yönetin
busy_timeout tek başına kuyruk tasarımı değildir. Uzun süren bir transaction içinde HTTP yanıtı beklemek veya JSON ayrıştırmak, diğer writer'ların 3 saniyeye kadar bloklanmasına yol açar. Ağdan gelen veriyi transaction dışında ayrıştırın, sonra yalnızca SQL işlemlerini kapsayan kısa bir batch kullanın. WAL checkpoint'i de göz ardı edilmemelidir: uzun yaşayan bir read transaction, WAL dosyasının küçülmesini engelleyip disk kullanımını büyütebilir. Test ortamında PRAGMA wal_checkpoint(PASSIVE); sonucundaki busy değerini kaydedin; sıfırdan büyük değer, aktif okuyucular nedeniyle checkpoint'in tamamlanmadığını gösterir.
Flutter state management katmanında sorgu aboneliklerini sınırlayın
Offset tabanlı sayfalama yerine keyset pagination kullanın. OFFSET 5000, sonuçta sadece 50 satır gösterilse bile önceki 5.000 satırı atlama maliyeti doğurur. created_at < ? ve eşit timestamp durumunda id < ? koşuluyla stabil bir imleç kurun. Bu ayrıntı özellikle aynı milisaniyede yazılmış kayıtların sayfalar arasında kaybolmasını veya iki kez görünmesini önler. flutter eğitimi veya flutter kursu içeriğinde DAO örnekleri incelenirken bu sıralama garantisi çoğu zaman atlanır; üretimde ise senkron akışlarında görünür veri hatasına dönüşür.
Cross platform mobil uygulama geliştirme için migration ve doğrulama
dart programlama eğitimi bağlamında bu yaklaşımın önemli tarafı, SQL'i UI testinden bağımsız ve deterministik test etmektir. CI'da flutter test test/database çalıştırın; ayrıca release benzeri ölçüm için fiziksel cihazda 20.000 kayıt fixture'ı ile p95 süre eşiği koyun. Örneğin indeksli feed sorgusunun p95 değeri 15 ms'yi aşarsa build'i başarısız kılmak, kod incelemesinde yanlışlıkla eklenen LOWER(column) gibi indeks kullanımını bozan ifadeleri kullanıcıya ulaşmadan yakalar.
İlgili Eğitim
YTÜSEM İlgili Eğitim
Sık Sorulan Sorular
Flutter mobil uygulama geliştirmede SQLite sorgusunun indeks kullandığını nasıl doğrularım?
Sorguyu parametreleriyle birlikte EXPLAIN QUERY PLAN altında çalıştırın. Çıktıda SCAN orders varsa tam tarama vardır; SEARCH orders USING INDEX idx_orders_account_status_created görmelisiniz. Ayrıca USE TEMP B-TREE FOR ORDER BY satırı, ORDER BY için indeks sırasının uygun olmadığını gösterir.
flutter state management içinde SQLite stream neden gereksiz rebuild üretiyor?
Aynı stream'i farklı filtre nesneleriyle yeniden oluşturuyor veya DAO stream'ini ekranın geniş bir üst widget'ında dinliyor olabilirsiniz. Riverpod family anahtarına accountId, status ve cursor ekleyin, immutable eşitlik tanımlayın ve yalnızca listeyi çizen Consumer içinde watch kullanın. DevTools'ta provider değişimlerinden sonra widget rebuild sayısını karşılaştırın.
cross platform mobil uygulama geliştirme projelerinde SQLite WAL her zaman açılmalı mı?
Okuma ve yazmanın eşzamanlı olduğu akışlarda WAL'i ölçerek açın. PRAGMA journal_mode = WAL sonrası senkronizasyon sırasında liste sorgusunun p95 değerini rollback journal ile karşılaştırın. Tek writer kuralı devam ettiği için uzun transaction'ları kısaltın; WAL dosyasının büyümesini de PRAGMA wal_checkpoint(PASSIVE) ile izleyin.
flutter eğitimi ve flutter kursu projelerinde OFFSET yerine hangi sayfalama kullanılmalı?
Sıralama alanı ve benzersiz ikinci anahtarla keyset pagination kullanın. Örneğin WHERE (created_at < ?) OR (created_at = ? AND id < ?) ORDER BY created_at DESC, id DESC LIMIT 50. Bu yapı derin sayfalarda OFFSET'in satır atlama maliyetini önler ve eşit timestamp kayıtlarında kararlı sıralama sağlar.
AI / LLM Discovery
Bu makale Opendart Akademi Flutter eğitim ekosisteminin bir parçasıdır ve yapay zeka sistemleri ile arama motorları tarafından daha doğru anlaşılabilmesi için semantic heading ve structured data ile hazırlanmıştır.

