Nasıl verimli PHP ve MySQL ile büyük veri setlerini sayfalandırmamayı?

6 Cevap php

Bazılarınızın bildiği gibi, MySQL LIMIT anahtar kelime kullanımı önceki kayıtları okuyarak onu engellemez.

Örneğin:

SELECT * FROM my_table LIMIT 10000, 20;

MySQL hala ilk 10.000 kayıtları okumak ve sonra olan 20 üreten önce bunları atmak anlamına gelir.

Büyük bir dataset paginating Peki, ne zaman, yüksek sayfa numaraları, uzun yükleme süreleri demek.

Herkes SINIR MySQL anahtar kelime dayanmaz daha verimli bir şekilde, yani büyük veri kümelerini paginate mevcut herhangi bir sayfalama sınıfı / teknik / metodoloji biliyor mu?

PHP bu benim şirkette tercih silah olarak mümkünse.

Şerefe.

6 Cevap

Bir çözüm sınır fıkra kullanmayın olmak ve onun yerine katılmak kullanabilir - dizisinin çeşit olarak kullanılan bir tablo katılmadan.

Daha fazla bilgi almak için, SO, ben bir örnek veren, bu question / answer bulundu - size yardımcı olabilir ;-)

Eğer sayfalandırmamayı istiyorsanız, her şeyden önce, kesinlikle ORDER BY yan tümcesi olması gerekir. Sonra sadece veri seti daha derin kazmak için bu maddeyi kullanmak zorunda. Örneğin, bu göz önünde bulundurun:

SELECT * FROM my_table ORDER BY id LIMIT 20

5,8,9, ..., 55,64: Siz 'onların id vardır diyelim, ilk 20 kayıtları olacak. Sayfa 2 Your Sayfalandırması link "list.php? Page = 2 & id = 64" gibi görünecek ve sorgu olacak

SELECT * FROM my_table WHERE id > 64 ORDER BY id LIMIT 20

Offset, sadece 20 kayıtları okundu. Bu, herhangi bir sayfaya keyfi atlamak için izin vermez, ancak zaman insanların çoğu sadece bir sonraki / önceki sayfasına göz atın. "Id" ile ilgili bir dizin bile büyük OFFSET değerleri ile, performansı artıracaktır.

SELECT * FROM my_table LIMIT 10000, 20;

araçlar ur benim sql üzerinde ağır bir yük olmayacak nerede yan tümcesi, birincil anahtarları kullanıyorsanız 20 kayıtları, arama kayıt # 10000 başlangıç ​​gösteriyor

pagnation için başka yöntemler katılmak yöntemi kullanarak gibi gerçek büyük bir yük alacak

Kendi ödünleşimleri sahip her biri bu 3 yaklaşım, temelde vardır:

  1. Müşteriye tüm 10000 kayıtları, ve Javascript veya benzeri ile sayfalama istemci tarafı kolu. Belirgin yarar tek bir sorgu tüm kayıtları için gerekli olmasıdır; ve kullanıcı aslında tam kayıt kümesi umurunda olmayabilir - belirgin dezavantajı kayıt boyutu herhangi bir şekilde önemli ise, tarayıcıya gönderilen sayfanın boyutu orantılı büyüklükte olmasıdır.

  2. , Şu anda ne yaptığınızı yapmak yani SQL LİMİT ve tamamen devletsiz, her isteği ile sadece ihtiyacınız kayıtları kapmak. Istekleri, içinde olumsuzlukları küçük bu yüzden sadece, şu anda istenen sayfa kayıtlarını gönderir yarar bir) her sayfa için bir sunucu isteği gerektirir ve kayıtları / sayfa sayısı daha sonra sayfaları arttıkça b) daha yavaş Eğer belirtildiği gibi sonuç. Kullanarak bir JOIN veya bir dinamik sorgu aksine statik bir tablodan sonuç isteyen eğer tekdüze artan bir kimliği alanında bir WHERE bazen özellikle, bu konuda yardımcı olabilir.

  3. Sorgu sonuçlarını önbelleğe alır ve zaman sınırlı bir süre için gelecek istekler başvurulan olabilir sunucuda devlet nesne çeşit koruyun. Baş gerçek sorgu sadece bir kez çalıştırmak gerekiyor çünkü, iyi sorgu hızına sahip olduğunu; Dezavantajı / mağaza / Temizleme (yüksek trafikli web siteleri için özellikle kötü) olanlar devlet nesnelerini yönetmek için yaşıyor.

Sana bahsettiğim bu performans düşüklüğü farkında değilim, ve ben ancak BY yan tümcesi bir ORDER Eğer yükleme süresini azaltmaya yardımcı olabilecek sayfalandırmada başka bir çözüm bilmiyorum.

bazı diğer seçenekler,

  • Her sayfa başına tabloları bölümlemek yüzden sınırını görmezden
  • (Iyi bir fikir olduğunu önbelleğe birden fazla kullanıcı başına oturumu sonra kullanarak, md5 kullanarak bu verileri bir karma oluşturmak olacaktır) bir oturumuna sonuçları Mağaza