Laboratuvar / Açık yöntem

Veritabanı optimizasyonu: sorgu ve indeks

200.000 siparişten rapor: 1,13 sn → 7,19 ms. Sentetik laboratuvar; 10 tekrarın medyanı. Kod ve ham veri açık.

TamamlandıKOBİKurumsal BTPartner

İndekssiz sorguşu sistemeAynı sorgu + bileşik indeks

SQLite 3.46 LABORATUVAR ÖLÇÜMÜ

Bütün tabloyu taramak yerine gereken kaydı bulun.

Müşteri bazında açık sipariş toplamları. Aynı SQLite motorunda, aynı sorgunun indeks öncesi ve sonrası.

İşinize etkisi

Rapor ve liste ekranları daha az CPU işiyle sonuç üretir. Önce sorgu planını düzeltmek, donanım büyütme ihtiyacını azaltabilir.

ÖNCEİndekssiz sorgu
YENİLENENAynı sorgu + bileşik indeks
Sipariş kaydı200.000
1.000Yalnız ölçülen yükler200.000
Gerçek zaman ölçeği
AYNI İŞ · AYNI VERİ10 tekrar · medyan
01

İndekssiz sorgu

Her müşteri özeti için sipariş tablosu taranır.

1,129 sn
CPU süresi
1,129 sn
02

Aynı sorgu + bileşik indeks

Müşteri, durum ve tutar alanlarını kapsayan indeks kullanılır.

7,188 ms
CPU süresi
7,187 ms
03

İndeks + toplu sorgu kontrolü

Aynı sonuç için toplulaştırılmış alternatif sorgu da çalıştırıldı.

10,158 ms
CPU süresi
10,16 ms

Çubuklar sıfırdan başlar; tüm uygulamalarda aynı süre ölçeği kullanılır.

Tamamlanma süresi azaldı99,4%Süre farkı: 1,122 snEski uygulama → yenilenen uygulama
Ne değişti?

Sorgudaki müşteri ve durum filtrelerine, tutarı da kapsayan bileşik indeks ekledik. Toplu sorgu alternatifini ayrı kontrol olarak tuttuk.

Tüm yük noktaları ve ölçüm tablosu
1.000 · Sipariş kaydı
UygulamaMedyan süreCPU süresi
İndekssiz sorgu5,995 ms5,996 ms
Aynı sorgu + bileşik indeks0,146 ms0,147 ms
İndeks + toplu sorgu kontrolü0,213 ms0,215 ms
3.000 · Sipariş kaydı
UygulamaMedyan süreCPU süresi
İndekssiz sorgu16,785 ms16,786 ms
Aynı sorgu + bileşik indeks0,227 ms0,228 ms
İndeks + toplu sorgu kontrolü0,292 ms0,293 ms
10.000 · Sipariş kaydı
UygulamaMedyan süreCPU süresi
İndekssiz sorgu55,749 ms55,743 ms
Aynı sorgu + bileşik indeks0,536 ms0,538 ms
İndeks + toplu sorgu kontrolü0,694 ms0,695 ms
30.000 · Sipariş kaydı
UygulamaMedyan süreCPU süresi
İndekssiz sorgu175,175 ms175,158 ms
Aynı sorgu + bileşik indeks1,23 ms1,231 ms
İndeks + toplu sorgu kontrolü1,695 ms1,696 ms
60.000 · Sipariş kaydı
UygulamaMedyan süreCPU süresi
İndekssiz sorgu345,649 ms345,617 ms
Aynı sorgu + bileşik indeks2,292 ms2,298 ms
İndeks + toplu sorgu kontrolü3,264 ms3,265 ms
100.000 · Sipariş kaydı
UygulamaMedyan süreCPU süresi
İndekssiz sorgu565,92 ms565,9 ms
Aynı sorgu + bileşik indeks3,691 ms3,693 ms
İndeks + toplu sorgu kontrolü5,213 ms5,214 ms
200.000 · Sipariş kaydı
UygulamaMedyan süreCPU süresi
İndekssiz sorgu1,129 sn1,129 sn
Aynı sorgu + bileşik indeks7,188 ms7,187 ms
İndeks + toplu sorgu kontrolü10,158 ms10,16 ms
İş yükünüzle CPU maliyeti

Ölçülen işlemci süresini kendi aylık hacminizle karşılaştırın.

Bir çalıştırma = 200.000 Sipariş kaydı.

Azalan CPU süresi / ay3,1162 saat

İşlem bedeli farkı / ay—Birim bedel girildiğinde hesaplanır.

Laboratuvar CPU süresi × girdiğiniz hacim ve birim bedel. Hosting faturası tahmini değildir; boşta kaynak, ağ, depolama, lisans ve geçiş dahil değil.

Kendiniz deneyin

Kayıtlı laboratuvar sonuçlarını birlikte oynatın.

Ölçek arttığında

İş yüküne göre süre

  • Önce
  • Sonra

İş yüküne göre süre (ms)

02004006008001.0001.2001.00060.000100.000200.0001.129,16 ms7,19 ms

Veri noktasını seçin

02004006008001.0001.2001.00060.000200.0007,19 ms

Veri noktasını seçin

Sipariş kaydıİşaretçiler: ölçülen noktalar
Tablo olarak göster
İş yüküne göre süre
Sipariş kaydıÖnceSonra
1.0005,99 ms0,15 ms
3.00016,78 ms0,23 ms
10.00055,75 ms0,54 ms
30.000175,17 ms1,23 ms
60.000345,65 ms2,29 ms
100.000565,92 ms3,69 ms
200.0001.129,16 ms7,19 ms

Nasıl ölçtük?

Ortam, protokol ve teknik değerlendirme

Ortam ve veri

Ortam
Apple M3; Docker Linux arm64, 2 CPU kotası, 1 GiB bellek. PHP 8.4.26 / SQLite 3.46.1.
Veri seti
200 müşteri; 1.000–200.000 deterministik sipariş. Her kolun bütün sonuçları ve kuruş toplamları eşit.
Araçlar
PHP 8.4.26 · SQLite 3.46.1 · hrtime / getrusage · OPcache / JIT off · native arm64 Docker
Tekrarlar
7 yük × 5 uygulama × 10 tekrar; ayrıca 70 ısınma gözlemi. Her ölçüm saklandı, kol sırası dönüşümlü.
Ham ölçüm verisini açın ↗

Bütün tabloyu taramak yerine gereken kaydı bulun.

Müşteri bazında açık sipariş toplamları. Aynı SQLite motorunda, aynı sorgunun indeks öncesi ve sonrası.

Aynı PHP/SQLite sürümleri, aynı sentetik kayıtlar, 200 müşteri. İki ısınma ardından her kol/boyut için 10 tekrar; bütün sonuç dizileri bağımsız oracle ile eşit. PHP toplam haritası her tekrarda yeniden kurulur. SQL okuma süreleri sıcak bellek içi veride; veri yükleme/indeks oluşturma dışında. İndeks boyutu ve tek kurulum gözlemi ham pakette ayrı. Birincil 200.000 kayıt noktası önceden seçildi.

Ölçüm betiğini inceleyin ↗

İşinize ne kazandırır?

Rapor ve liste ekranları daha az CPU işiyle sonuç üretir. Önce sorgu planını düzeltmek, donanım büyütme ihtiyacını azaltabilir.

Değişiklik ve kapsam

Sorgudaki müşteri ve durum filtrelerine, tutarı da kapsayan bileşik indeks ekledik. Toplu sorgu alternatifini ayrı kontrol olarak tuttuk.

SQLite 3.46.1, sıcak bellek içi veri, 200 müşteri. İndeks oluşturma ve yazma maliyeti süre grafiğine dahil değil; ham pakette indeks boyutu ve kurulum süresi var. Başka motorların sonucu değildir.

İndeksin bedeli ve alternatif sorgu

200.000 kayıtta indeks 3,899,392 bayt ek alan kullandı; tek oluşturma gözlemi 77.56 ms. Yazma yükü bu okuma deneyinin kapsamında değil. İndeksli toplu sorgu alternatifi de tabloda: ölçülmüş olması, her sorgudan hızlı olduğu anlamına gelmiyor. Sorgu planları taramadan kapsayan indeks aramasına geçişi gösterir.

Kendi sisteminizde başlangıç

En çok bekleten işlemi, veri miktarını ve yoğun saatleri birlikte belirleyelim. Önce bu işin baz ölçümünü alır, sonra kodu ve erişim biçimini değiştirip aynı sonucu karşılaştırırız.

Ne yaptık?

  1. İş kuralı ve veri

    YZSentetik iş akışı, testler ve ölçüm otomasyonu hazırlandı.

    DoğrulamaYayınlanan kod ve ham sonuçlar incelemeye açıktır; müşteri projesi değildir.

  2. Uygulama değişikliği

    YZSorgudaki müşteri ve durum filtrelerine, tutarı da kapsayan bileşik indeks ekledik. Toplu sorgu alternatifini ayrı kontrol olarak tuttuk.

    DoğrulamaÇıktı eşitliği bağımsız kontrolle doğrulandı; bütün tekrarlar pakette tutuldu.