Eklentiniz çok fazla veriye sahip olacaksa, kullanımı wp_postmeta
aşağıda gösterildiği gibi iyi bir fikir DEĞİLDİR:
WooCommerce'i örnek alarak, ~ 30.000 ürüne sahip bir mağazada, ürün başına ortalama ~ 40 post meta (nitelik ve her şey), ürün başına 5 ürün resmi olacak, yani ürün başına 4 ürün meta olacak Her görüntü için:
30.000 ürün x 40 meta = 1.200.000 satır wp_postmeta
+
30.000 ürün x 5 görüntü, her biri için = x 600.000 satır için x x görüntü wp_postmeta
Yani sadece 30.000 ürünle 1.800.000 satırın olmasını bekliyorsunuz wp_postmeta
.
Ürünlerinize veya ürün resimlerinize daha fazla özellik eklerseniz, bu sayı çarpılacaktır.
Bununla ilgili sorun iki yönlüdür:
- MySQL ile öz katılım çok pahalı
wp_postmeta
Daha sonra mysql sürümleri kullanmıyorsanız tablo indekslenmez (yani FULLTEXT indeksi yoktur meta_value
)
Gerçek bir davadan bir örnek vermek için:
SELECT meta_value FROM wp_postmeta WHERE meta_key LIKE '_shipping_city'
Bu, tüm sipariş ayrıntılarından nakliye şehrini seçer ve giriş seviyesi tahsis edilmiş bir sunucuda 5-10 sipariş olsa bile yaklaşık 3 saniye gelir . Bunun nedeni, sorgunun wp_postmeta
canlı kurulumda ~ 3 milyon satır içeren bir tablodan çalıştırılmasıdır .
Ana sayfa bile yavaş geliyor, çünkü tema çeşitli öğeleri wp_postmeta
- kaydırıcılardan, birkaç inceleme ekinden, birkaç başka metadan alıyor. Genel olarak ürün listeleme işlemi çok yavaştır, ürün listeleme işlemi sırasında aramalar benzer şekilde yavaştır.
Bunu normal yöntemlerle düzeltemezsiniz. Elastik Arama'yı sunucunuza yerleştirebilir ve Wordpress'te bir Elastik Arama eklentisi kullanabilirsiniz, redis / memcached kullanabilirsiniz, iyi bir sayfa önbellek eklentisi kullanabilirsiniz, ancak sonuçta temel sorun devam edecektir - şişirilmiş herhangi bir miktarda veri almak wp_postmeta
Ne zaman yapılırsa masa yavaşlar. Aşağıda uygulamaya koyduğum çözümü test ettiğim sunucuda, tüm bunlar düzgün bir şekilde kurulmuş ve yapılandırılmış ve optimize edilmiş ve site, giriş yapmayan kullanıcılar veya önbelleğe alınan eklentilerin başlatılmasından bu yana sıkça yapılan sorgular için tamamen uygun şekilde çalıştı.
Ancak, oturum açan bir kullanıcının sık yapılan bir şey yapmayı denediği andan beri, kasetler, eklentileri önbelleğe almak veya herhangi bir yardımcı program, önbelleğe almak veya başka bir şey yapmak için db'den gerçek verileri almak istedi, işler yavaşladı.
Bu yüzden başka bir şey denedim:
Tüm ürün metalarını (post tip ürün için postmeta ) kod tarafından oluşturulan özel bir tabloya almak için küçük bir eklenti kodladım . Bu eklenti her gönderi için tüm metaları aldı ve her metayı sütun olarak ekleyerek ve değerleri her satıra ekleyerek bir tablo oluşturdu. EAV formatını yatay, düz bir ilişkisel formata dönüştürdüm. Ayrıca postmeta'yı wp_postmeta
tablodan taşınan tüm ürünlerden silmek için de eklentim vardı .
Ben onun yanındayken, ek posta metalarını ve diğer tüm yazı tiplerinin metalarını kendi tablolarına taşıdım .
Daha sonra get_(post_type)_meta
, yeni özel tablolardan sunulmak üzere meta verilerin alınmasını geçersiz kılmak için filtreye bağladım .
Şimdi aynı sorguyu daha önce sordum, bu sayı ~ 3 saniye sürdü wp_postmeta
, ~ 0,006 saniye alıyor. Site şimdi yeni bir WP kurulumuymuş gibi davranıyor.
....................
Doğal olarak, işleri Wordpress yoluyla yapmak daha iyidir. Aslında bu norm.
Bununla birlikte , EAV tablosunun ölçeklendirmede çok verimsiz olduğu da açıktır. Sonsuzca esnektir ve herhangi bir veri depolamanıza izin verir, ancak bunun için ödediğiniz fiyat performanstır. Bu temel bir işlemdir.
Bu bağlamda, bir yığın ton veriye sahip olmak isteyen birisine ve - tanrıyı yasakla - bu veriyi sorgulamak / araştırmak, wp_postmeta
tablonun kesin olarak kullanması zor . Performans hit harika olacak.
Özel tablolarınızı kullanmak, verilerinizin toplanmasına ve hala yeterince hızlı kalmasına olanak sağlar.
Tıpkı Easy Digital Downloads eklentisinin yaratıcısı Pippin Williams'ın, eklentisini kodlamaya yeni başlıyorsa, uzun süre kullanacak veya çok fazla veri toplayacak bir şey oluşturacaksanız, özel tablolar kullanacağından bahsettiği gibi, Özel masalarınızı iyi tasarlarsanız kullanmak daha verimlidir.
Başka herhangi bir eklenti / eklenti geliştiricisinin, verilerinizi almadan önce ve sonra verilerinizi değiştirmek için eklentinize bağlanma yoluna sahip olduğundan emin olmalısınız. Bunu yaparsan, oldukça sağlamsın.