MySQL sorgu Önbellekleme

3 Cevap php

Tamam, filtreler, belirli bir dizi (örneğin tarih aralığı) için istekleri istatistiklerine kullanıcılara izin gereken oldukça büyük bir istatistik sistemi, inşa ediyorum.

örneğin Bu her oyuncu yaptı player_id ve öldürür miktarı dahil 10 sonuç döndüren basit bir sorgu:

SELECT player_id, SUM(kills) as kills
FROM `player_cache`
GROUP BY player_id
ORDER BY kills DESC
LIMIT 10
OFFSET 30

Yukarıdaki sorgu 30 (sonuçların yani 3 'sayfa') tarafından sonuçlarını telafi edecektir. Kullanıcı daha sonra 'sonraki' sayfasını seçtiğinde, o zaman 30 yerine 40 OFFSET kullanır.

Benim sorunum sadece 10 fazlası ile sonuçlarını dengelemek için, tekrar tekrar () SUM gerçekleştirirken, LIMIT / OFFSET çifti aynı veri kümesi üzerinde kullanılıyor olsa bile, hiçbir şey önbelleğe olmasıdır.

Yukarıdaki örnek sadece daha fazla alan verir, ve çok uzun zaman alır (20 + saniye, ve sistem büyüdükçe sadece uzun alacak) daha büyük bir sorgu basitleştirilmiş bir sürümüdür.

Yani aslında OFFSET LIMIT / uygulanmadan önce devlet önbelleğe alarak, sayfa yükleme hızlandırmak için bir çözüm arıyorum.

Teşekkürler!

3 Cevap

Sen ders kullanımı önbelleğe olabilir, ama mysql sorgu, sonuç değil önbelleğe alma öneriyoruz.

Ama önce ilk şey, emin a) sizin verilere doğru indeksleme sahip olduğunuzdan emin olun, b) İşte bu varlık used.

Bu işe yaramazsa tarafından grup büyük veri setleri ile yavaş olma eğilimindedir gibi, statik bir tablo / dosya / veritabanı özet verileri koymak gerekir.

Eğer veri sunucu tarafında önbelleğe alma gerçekleştirmek yardım vb çeşitli teknikler / kütüphaneler vardır. PHP Caching to Speed up Dynamically Generated Sites Bu oldukça basit ama kendini açıklayıcı bir örnek sunmaktadır.

Periyodik olarak uzun bir sorgu çalıştıran ve bir özet tablodaki tüm sonuçları saklamak düşündünüz mü? Hiçbir gruplaşmalar var Joın bir hayır vardır çünkü özet tablo hızlı bir şekilde sorgulanabilir. Olumsuz özet tablo-to-the-dakika geçerli olmadığıdır.

Ben bu LIMIT / OFFSET sorunu gidermez farkında, ama bu zor bir sorgu, birden çok kez çalışan sorunu çözmek yapar.

Veri güncellenir ne sıklıkta bağlı olarak, veri depolama bu basit bir çözümdür. Temelde:

  1. Benzer bir tablo yapısı ile ikinci bir veritabanı (veri ambarı) Yapı
  2. Istediğiniz şekil içinde verileri almak için veri ambarı veritabanı optimize
  3. Periyodik (örn. gece boyunca her gün) veri ambarına canlı veritabanından veri kopyalamak
  4. Sayfa veri ambarı, verilerini almak olun.

Orada kullanabileceğiniz farklı optimizasyon teknikleri vardır, ama içine bakarak değer:

  1. Eğer rapor gerekmez alanları Çıkarma
  2. Mevcut tablo için ekstra indeksler ekleme
  3. İhtiyacınız şeklinde verileri özetlemek yeni tablolar / görüşlerimi ekleyerek.