Daha hızlı WordPress siteleri için SQL sorgusunu optimize etme
Yavaş SQL Sorgu Tanımlama Yavaş SQL sorgularını iyileştirmenin ilk adımı bulmaktır. Ashley, önceki blogdaki hata ayıklama sorgusu monitör eklentisini ve eklentinin yavaş SQL sorgusunu tanımlamak ve veritabanı performansını iyileştirmek için gerçekten çok değerli bir araç haline getiren veritabanı sorgusu özelliğini övdü. Eklenti, sayfa istekleri sırasında çalıştırılan tüm veritabanı sorgularını bildirir. Bu, onu çağıran ve yinelenen ve yavaş kuyruğu vurgulayan kod veya bileşenlere (eklentiler, temalar veya çekirdek WordPress) göre filtrelemenizi sağlar: Hata ayıklama eklentisini üretim sitesine yüklemek istemiyorsanız (belki de bazı performans ek yükü eklemekten endişe duyuyorsunuz), yürütülmesi için belirli bir zaman gerektiren tüm sorguları kaydeden yavaş kraliçe mysql günlüğünü etkinleştirmeyi seçebilirsiniz.Bu, sorguları kaydetmek için yapılandırılması ve bir yer ayarlaması nispeten kolaydır.Bu bir sunucu seviyesi tweak olduğundan, performansın performansı sitedeki hata ayıklama eklentisinden daha az olacaktır, ancak kullanılmazken kapatılmalıdır.Yavaş SQL sorgusunu anlama Artırmak istediğiniz pahalı kuyruğu bulduktan sonra, bir sonraki adım kuyruğu yavaşlatan şeyi anlamaya çalışmaktır.Son zamanlarda sitemize gelişim sırasında, yürütülmesi yaklaşık 8 saniye süren bir sorgu bulduk!
L.key_id, l.order_id, l.activation_email, l.licence_key, l.software_product_id, l.software_version, l.activations_limit, l.Created, l.renewal_type, l.renewal_id, .status, pm.post_id as ‘ürün ‘, pm.meta_value OIZ6Q8A_WOOCOMMERCE_SOFTWARE_ILILENCES’ten’ User_id ‘AS OIZ6Q8A_WOOCOMMERCE_SOFTWARE_SUBSCRIPS S üzerinde s. PM2.meta_key = ‘_software_product_id’ ve pm2.meta_payment_date tarafından PM2.meta_key = ‘_software_postmeta pm2. Bu sorgunun amacı, müşterinin numarasını bildiğimiz müşteriler için tüm müşterileri almaktır. WooCommerce, siparişlerin özel bir yazı türü olarak saklanmasına rağmen, müşteri kimliğinin (her müşterinin onlar için yapılan WordPress kullanıcılarının aldığı mağaza için) Post_author olarak depolandığı, ancak Meta Post verilerinin bir parçası olarak saklandığı oldukça karmaşık bir veri modeline sahiptir.
Bu SQL ifadesini daha karmaşık ve anlaşılmasını daha zor hale getiren yazılım abonelik eklentisi tarafından yapılan özel bir tabloda da bir araya geliyor. Kuyruğu daha iyi anlamaya devam edelim. MySQL, SQL MySQL sorgusunun optimizasyonu için arkadaşınızdır, sütunlar, veri türleri, varsayılan gibi tablo yapıları hakkında bilgi görüntülemek için kullanılabilecek yararlı bir açıklama ifadesine sahiptir. Eğer çalıştırırsanız wp_postmeta’yı tanımlarsanız; Aşağıdaki sonuçları göreceksiniz: Doğal iptal türü alanları ek
) imzalanmamış
/td>
Yavaş kuyruğumuzun sonuçları aşağıdadır: Kimlik Seçin Tablo Türü Türü Type_let Key_len Ref Ek Satır
1
Basit
PM2
ref
meta_key
meta_key
576
sabit
28
Nerede kullanarak; Geçici olarak kullanın; Filesort
</s 1
Basit
pm
ref
Post_id, Meta_key
meta_key
576
sabit
37456
nerede
1
Basit
p
eq_ref
Main, type_status_taten
ana
8
DeliciousbrainsDev.pm.pmor_id
1
1
1
basit
/td>
1
basit
s
eq_ref
Main
Main
8
DeliciousbrainsDev.L.Key_id
1
Cancel
> İlk bakışta, bunun yorumlanması kolay değildir. Neyse ki Sitepoint'teki insanlar ifadeyi anlamak için kapsamlı bir rehber hazırladılar.
En önemli sütun, tablonun nasıl birleştirildiğini açıklayan türdür. Her şeyi görürseniz, bu MySQL'in tüm tabloyu diskten okuduğu, G/Ç hızını artırdığı ve CPU'nun yüklenmesi anlamına gelir. Bu "Tam Tablo Taraması" olarak bilinir - daha sonra hakkında daha fazla bilgi. Satırlar sütunu da MySQL'in ne yapması gerektiğinin iyi bir göstergesidir, çünkü bu, sonuç bulmak için kaç satır arandığını gösterir. Açıklama ayrıca bize optimize etmek için kullanabileceğimiz daha fazla bilgi verir. Örneğin, PM2 Tablosu (WP_Postmeta), FileSort'u kullandığımızı söyler, çünkü sonuçların ifadeye göre bir sipariş kullanılarak sıralanmasını istiyoruz. Kuyruğu da gruplandırırsak, yürütmeye ek yük ekleyeceğiz. MySQL çalışma tezgahı yürütme planıyla görsel yatırım, bu tür bir araştırma için başka bir yararlı ve ücretsiz araçtır. MySQL 5.6 ve üzeri olarak çalışan veritabanı için, açıklamanın sonuçları JSON olarak görüntülenebilir ve MySQL çalışma tezgahı JSON'u ifadenin görsel yürütme planına değiştirir:
Bu, maliyetlere göre sorguları renklendirerek dikkatinizi otomatik olarak soruna çeker. WP_WOOOCOMMERCE_SOFTWARE_LILCENTS'e (aka L) katılmanın ciddi bir sorunu olduğunu hemen görebiliriz. Kuyruk ayarını yapalım! SQL Yavaş Kuaternity'yi, WP_WOOCOMMERCE_SOFTWARE_LICECTS tablosunun WP_POSTS tablosuna bir kombinasyonu olarak dizine eklenmeyen sipariş_id sütunu kullandığından, tam tablo taramasının kuyruk optimizasyonu ile çözülmesi. Bu, yavaş sorgular için yaygın bir sorundur ve sorguların performansını iyileştirmek için kolayca çözülebilir. Sipariş_id index, tablodaki verileri tanımlamanın önemli bir parçasıdır ve eğer böyle sorarsak, gerçekten sütunda bir dizinimiz olmalıdır değilse, MySQL gerekli satırları bulmak için her tablo satırını tarar. Dizini ekleyelim ve hangi işlevleri görelim: wp_wooocommerce_software_licences (sipariş_id)
Sorularınızı bilin Kueri'yi kontrol edin - Katılmak uğruna katılın, alt sorguya göre.Gereksiz şeyler mi yapıyor?Optimizasyon yapılabilir mi?Bu durumda, Shop_order türünü yayınlamak için bir ifadeyi sınırlarken sipariş_idini kullanarak bir lisans tablosunu birleştiririz.Bu, sadece siparişin doğru sırasını kullandığımızdan emin olmak için veri bütünlüğünü korumaktır, ancak aslında bu aşırı bir sorgu parçasıdır.Tablodaki yazılım lisans hattının, Post tablosundaki WooCommerce dizisi ile ilgili bir sipariş_idine sahip olmasının güvenli bir bahis olduğunu biliyoruz, çünkü bu PHP eklentisi kodunda uygulandı.Kombinasyonu siler ve durumu iyileştirip geliştirmediğini görelim: Bu büyük bir tasarruf değil ama şimdi 3 saniyenin altında. Her şey önbelleğe alın! Sunucunuz varsayılan olarak MySQL sorgu önbelleğini etkinleştirmezse, etkinleştirilmelidir. Bu, MySQL'in sonuçlar tarafından yürütülen tüm ifadelerin kayıtlarını saklayacağı ve aynı ifade yürütüldüğü anlamına gelir, sonuç önbelleği döndürülür. Önbellek bayat olmaz, çünkü masa değiştirildiğinde MySQL önbellekleri temizler. Sorgu Monitörü, sorgularımızın bir sayfa yüklemesinde 4 kez çalıştığını ve MySQL sorgu önbelleğini etkinleştirmek iyi olmasına rağmen, bir istekte veritabanına yinelenen bir okuma tamamen önlenmelidir. PHP kodunuzdaki statik önbellekleme, bu sorunun üstesinden gelmenin basit ve çok etkili bir yoludur. Temel olarak sorguların sonuçlarını ilk talep edildiğinde veritabanından alırsınız ve bir sınıfın statik özelliğinde saklarsınız ve bir sonraki çağrı statik özelliğin sonuçlarını döndürür: Sınıf wc_software_subscription {korumalı statik $ abonelikleri = dizi (); genel statik işlev get_user_subscriptions ($ user_id) {if (isset (static :: $ abonelikler [$ user_id])) {return static :: $ abonelikler [$ user_id]; } Global $ wpdb; $ sql = '...'; $ sonuçlar = $ wpdb-> get_results ($ sql, array_a); statik :: $ abonelikler [$ user_id] = $ sonuç; Dönüş $ sonuçları;
}} Önbellek, kullanılan nesneden daha spesifik olarak bir talep ömrüne sahiptir.Tüm isteklerde hayatta kalan sorguların sonuçlarını görürseniz, kalıcı bir nesne önbelleği uygulamanız gerekir.Ancak, kodunuz önbellekleri yönetmekten sorumlu olmalı ve temel veriler değiştiğinde önbellek girişini iptal etmelidir.Kutunun dışında düşünmek, sadece kuyrukla uğraşmaktan veya bir dizin eklemekten biraz daha fazla iş içeren sorguların yürütülmesini denemek ve hızlandırmak için alabileceğimiz başka yaklaşımlar da var.Kuyruğumuzun en çok bölümlerinden biri, müşteri kimliklerinden ürün kimliklerine tabloları birleştirmek için yapılan bir iştir ve bunu her müşteri için yapmalıyız.Ya tüm bunları sadece bir kez yaparsak, ihtiyaç duyduğumuzda müşteri verilerini alabiliriz? Tüm lisanslar için kullanıcı kimlikleri ve ürün kimlikleri ile birlikte lisans verilerini depolayan tablolar oluşturarak verileri normalleştirebilir ve yalnızca belirli müşterileri isteyebilirsiniz. Lisans tablosuna ek/güncelleme/silme üzerindeki MySQL tetikleyicisini kullanarak tabloyu yeniden oluşturmanız gerekir (veya diğeri verilerin nasıl değişebileceğine bağlıdır), ancak bu verilerin performansını önemli ölçüde artıracaktır. Benzer şekilde, MySQL'deki sorularınızı yavaşlatırsa, kuyruğu iki veya daha fazla ifadeye ayırmak ve PHP'de ayrı ayrı çalıştırmak ve daha sonra koddaki sonuçları toplamak ve filtrelemek daha hızlı olabilir. Laravel de aynı şeyi ilişkiyi Eloquent'e yüklemek için istekli yaptı. WordPress, çok fazla veriniz ve birçok farklı özel yayın türünüz varsa, WP_Posts tablosundaki daha yavaş sorgulara karşı savunmasız olabilir. Gönderi türünüz için kuyruğun yavaş olduğunu düşünüyorsanız, özel bir gönderi depolama modelinden ve özel bir tabloya geçmeyi düşünün. Son zamanlarda, artışa devam eden Postmeta masamızın boyutu nedeniyle kuyruğun yavaşladığını keşfettik (şu anda 2,5 milyon satırda). Kueri iki kez masaya katıldığı için - bir kez müşteri kimlikleri için ve bir kez ürün kimlikleri için, birleşiklerden birini silmeye karar verdik. Lisansın hedefi olan ürünün bir dize temsili olan lisans tablosuna 'Software_product_id' kaydettik. WP için WPMDB-DEV, DB Pro geliştirici lisanslarını taşıyın. Bununla birlikte, WooCommerce ürün kimliğinin gerçek soyutlamasının sitemiz için gerçek bir amacı yoktur, bu nedenle 'Software_product_id' sütunu 'sütun için' sütunu değiştiririz.