Yavaş WordPress Veritabanı Sorgularını Bulmak ve Düzeltmek İçin Yararlı Püf Noktaları

Yayınlanan: 2019-04-17

Orta düzeyde SQL sorguları, WordPress uygulama geliştirme sitesinin yürütülmesini zorlayabilir. Arada bir, ılımlı sorgulamalar, asla bu şekilde yapılmaması gereken yetersiz yapılandırılmış SQL'in bir yan etkisidir.

Dahası, bazı durumlarda, ılımlı sorgulamalar, gerçekte, belirli bir noktada hızlı sorulardı - ancak site daha deneyimli hale geldikçe, sorgulama giderek yavaşladı ve genişleyen veritabanının farkında olmak için güçsüz kaldı.

SQL'in ne kadar ılımlı hale geldiğine rağmen, WordPress uygulama geliştirmedeki sorunlu soruları keşfetmek ve düzeltmek için birkaç yaklaşım araştırılmalıdır. Arada sırada belirli bir web uygulaması gerektirebilir ve özel iyileştirme yapmak için yeterli enerjiye, yeteneğe veya harcama planına sahip olmayabilir. Herhangi bir hazırlık yapmadan oluşturmak bazı sorunların cevabı olabilir, ancak mevcut bir kod tabanından başlamaktan daha uzun sürebilir. WordPress başlangıçta bir blog oluşturma aşaması olarak yapılandırıldı ve bunun için olağanüstü olmaya devam ediyor. Her ne olursa olsun, tamamen gelişmiş bir içerik yönetim sistemine (CMS) dönüşmüştür ve birkaç amaç için, hızlı bir şekilde ve özel iyileştirmeden temelde daha düşük bir harcama planıyla güçlü bir web uygulaması bile oluşturabilir. WordPress yerleşik geliştirme uygulamaları sunarken, ekstra kullanışlı hale getirmek için web uygulamaları için kullanılabilir. Doğal sayfa ve gönderi yapıları birçok şey için kullanılabilir, ancak özel bilgi ve alanların dahil edilmesi, aranması veya sorgulanması, kontrol edilmesi ve gösterilmesi gerekiyorsa, bazı ekstra çalışmalar gerekir.

Yavaş Sorguları Bulma

Ilımlı soruların kökenini bulmak iki aşamadan oluşur:

  1. Hangi soruların gerçekten ılımlı olduğunu bulmak.
  2. Onları çalıştıran programı belirleme.

Orta düzeyde sorguları keşfetmelerini sağlayan iki modüle ve bir SaaS'a göz atmalısınız.

Sorgu İzleyicisi

Şu anda çalıştırılan sayfa hakkında bilgi almak için bu modül kullanılabilir. WordPress'in iç etkinlikleriyle ilgili tüm bir veri kümesine rağmen, aşağıdakilerin nokta nokta dağılımını verir:

  • Bu talep üzerine kaç soru oluştu?
  • Sayfadaki hangi sorgu en fazla süreyi aldı?
  • SQL sorularına en fazla enerjiyi hangi kapasiteler yatırdı?
  • Bu sorguların modüllerden, konulardan veya WordPress merkezinden kaynaklanıp kaynaklanmadığı

Sorgu ekranı, sinir bozucu kırmızı içerikli ılımlı soruları bile tanır, bu da SQL sorununu seçmeyi çok kolaylaştırır.

Hata Ayıklama Çubuğu

Buz gibi ılımlı SQL bulmak için bir başka olağanüstü araç, eski, güvenilir Hata Ayıklama Çubuğu modülüdür. Hata Ayıklama Çubuğu, bir sayfa aşağıdaki gibi konularla yüklendiğinde WordPress'in iç işleyişi hakkında bir veri sağlar:

  1. WP_Query parametreleri
  2. Veri talep etme (yenileme kurallarının koordinasyonunu sayma)
  3. Mevcut sayfa tarafından üretilen SQL sorguları

Hata Ayıklama Çubuğunda SQL takibini etkinleştirmek için, kullanıcının sitede bir yerde SAVEQUERIES'e izin vermek için bir noktaya değinmesi gerekir - muhtemelen wp-config.php içinde

Dikkat: SAVEQUERIES sitedeki yürütmeyi etkiler ve muhtemelen bir nesil sunucuda kullanılmamalıdır. Ancak, bir ilerleme makinesinde kullanılabilir.

Debug Bar ile orta düzeyde SQL bulmak çok kolay değil. Örneğin, sıralanabilir tablolar vermez veya kullanıcı için ılımlı sorgulamalar yapmaz. Hata Ayıklama Çubuğunun sağladığı, kullanıcıyı tam olarak bir sorunun kaynağının yönüne yönlendiren bir kapasite takibidir.

Bu, yüklenen belgelerin ve yürütülen soruşturmada ortaya çıkan kapasitelerin bir özetidir. Çoğu zaman, kişi özetteki mutlak devam etme bölümüne meraklıdır; burası ılımlı sorunun yürütüldüğü ve kişinin avına başlaması gereken yer. Bu soruyu soran her kapasitenin ayarına sahip olmanın uygun yanı, her durumda SQL'in neden yürütüldüğüne dair içgörü ortaya çıkarabilmesidir.

Yeni Kalıntı

NewRelic, WordPress uygulama geliştirme de dahil olmak üzere web uygulaması geliştirmenin yürütülmesini ölçen ve görüntüleyen bir yönetimdir. Yönetim, sitenin yürütülmesi hakkında bir metrik ton veri verir. NewRelic'in SQL sorguları için kullanıcıya her dakika ayrıntılarını verdiği bilgilerdeki tüm yön duygusunu kaybetmek hiç de zor değil.

NewRelic ve daha önce referans verdiğimiz modüller arasında dikkate değer iki zıtlık vardır:

  1. NewRelic, her bir işlevde harcanan zamanın tam olarak hesaplanmasına kadar PHP'nin yürütülmesi hakkında çok daha fazla bilgi verir.
  2. NewRelic, siteye olan her talebi gözden uzak bir yerde izler, böylece daha sonra orta düzeyde SQL'i keşfetmek için başvuruda bulunabilir. Modüller ona sadece mevcut sayfayı verir.

NewRelic'in sitenin yürütülmesi hakkında genel veriler veren ücretsiz bir düzenleme düzeyine sahip olması önemlidir, ancak tekil talepleri kontrol etmek ve makul sorgular bulmak için süslü oranlar ve sonlar için ücretli bir düzenlemeye geçmek zorunda kalacaktır.

EXPLAIN ile Yavaş Bir Sorguyu Anlama

Bu noktaya kadar, cihazlar ılımlı soruları bulmak için güvence altına alındı. Şu anda bu sorgulamaların neden bir şeyleri engellediği bilinmelidir.

MySQL EXPLAIN parolası, neler olup bittiğini netleştirmek için etkinleştirebilir. Bir sorgunun başına EXPLAIN eklemek, MySQL'in bir soruyu nasıl yürüttüğünü gösterir. Karmaşık sorgular için EXPLAIN, SQL'lerdeki orta düzeyde odakları, örneğin orta düzeyde alt sorguları veya boşa harcanan etkinlikleri ayırt etmeye yardımcı olabilir.

Yavaş Sorguları Düzeltme

Sorguların ılımlı olduğu anlaşıldığından ve EXPLAIN, kullanıcıya bunun nedenini açıkladığı için, bu uykulu sorunları düzeltmek için birkaç seçeneğe göz atılmalıdır.

Seçenek 1: Soruyu Çevirmek

Gönderiyi Düzenle ekranını çok yavaş bir orana sokan bir soru olabilir. Sorgu, Özel Alanların meta kutusunun bir parçasıydı.

Kesin SQL parçası, ks29so_postmeta tablosundan büyük olasılıkla alt çizgi işaretiyle başlamayan bir meta_keys listesi getiriyor. GROUP BY açıklaması, her sonucun özel olduğunu ima eder.

Bu sorguyu birden çok kez çalıştırdığınızda, ne kadar sürebileceği şu şekildedir:

1.7145 saniye

1.7911 saniye

1.8076 sn

1.7707 saniye

1.8456 saniye

Benzer çıktılarla sonuçlanan bir sorgu geliştirilebilir. Bir tür meta_key olarak seçilmelidir. İstisna, özellikle bir SQL açıklaması olan eşdeğer bir kelimedir!

Seçenek 2: Dizin Ekleme

Kullanıcı bir dizi MySQL tablosunda bir SQL sorusu çalıştırırken, belirli bir sorgu için önemli olan satırların hangileri olduğunu anlamak için tüm tabloyu incelemesi gerekir. Masanın büyüdüğü noktada, bu kontrol oldukça zaman almaya başlar.

MySQL kayıtlarının geldiği yer burasıdır. Listeler bilgiyi bir tabloda alır ve bilgiyi bulmayı çok daha az zorlayacak şekilde düzenler. Dosyalar, bilgileri belirli bir şekilde sıralayarak, MySQL'in her sorgulama için gerçekleştirdiği filtreleme ölçüsünü azaltmaya yardımcı olur.

Dosyalar tek segmentlere veya çeşitli bölümlere eklenebilir.

Meta_key üzerindeki bir dosyada, ilk SQL soru zamanı biraz şuna benzer:

0.0041 saniye

0.0023 sn

0,0030 sn

0.0025 saniye

0,0019 saniye

Bu son derece akıllıca.

Dosyalarda bir uyarı ifadesi: INSERT her sütun oluşturduğunda veya af tablosunda UPDATE kullanıldığında, liste yeniden belirlenir ve bu pahalı bir faaliyet olabilir. Kayıtlar tablodan okumayı daha hızlı hale getirir, ancak tabloya yazmak daha yavaştır. Düzgün yerleştirilmiş bir dizin listesi son derece iyi çalışabilse de, listenin veritabanı üzerindeki genel etkilerini kontrol etmeden kişi buna kafayı takmamalıdır.

Seçenek 3: Sorgu Sonuçlarını Önbelleğe Alın

Bir kez ılımlı bir soru olduğu anlaşıldığında. Soruyu değiştirmek yerine, sorgulamanın art etkilerini ortadan kaldırdığı bir senaryo olabilir. Bu şekilde, kişi sorgulamanın ne kadar düzenli yapıldığını sınırlayabilir ve çoğu zaman “serbest geçiş” elde edebilirdi.

WordPress Transients API, sorguları ayırmanın yollarından biridir. Geçici durumlar, örneğin, maliyetli görevlerin sonuçlarını ortadan kaldırmak için kullanılır.

  • Dış sitelere yapılan istekler (örneğin devam eden Facebook gönderileri almak)
  • Yavaş elleçleme yığınları (örneğin, alışılagelmiş bir artikülasyonla çok büyük diziler aramak)
  • Yavaş veritabanı sorguları!
Bir Yaklaşım Seçmek

Ortaya konulmuş bir dizi alternatif vardır ve bu ılımlı sorgulamayı anlamak için büyük olasılıkla on yedi farklı yaklaşım vardır. Hangi yaklaşımı benimsemeli?

Seçenek 1 (soruyu değiştirerek) mükemmel sonuçlar verdi. Ancak, değiştirilen soruşturmanın genellikle benzer sonuçlara sahip olmama olasılığı göz önünde bulundurulmalıdır. Kişi farkında olmadan kodu biraz kapalı bir soruyla bozabilir.

Alternatif 2 (bir kayıt dahil), sorgu tarafından kullanılan tablo ve bölümlere bağlı olarak sürekli olarak düşünülemez. WordPress uygulama geliştirme merkezi tabloları nedeniyle, kayıtların diğer etkileri üzerinde durulması gerekir:

  • Merkez yenileme rutini ek listeler bekliyor mu?
  • Bir dosya eklemek, INSERT ve UPDATE gibi farklı sorguları yumuşatır mı?

Alternatif 3 (evsiz insanlar aracılığıyla sonuçların saklanması) önemsiz bir etkiye sahiptir - kullanıcının ilk sorguyu değiştirmesine gerek yoktur ve veritabanı yapısını ayarlamaya gerek yoktur.

Genellikle insanlar 3. seçeneği tercih ederler. Kişinin özel durumunda, düzelttiği soruya veya SQL sorunları olan belirli siteye bağlı olarak başka bir alternatif seçebilir. Yürütme sorunlarının çoğuna kesinlikle tek önlemli bir yanıt yoktur, bu nedenle birinin diğerinin kararıyla farklı olmasına veya bir an gecikmeden üçünden her birini denemesine izin verilir!

Güncel Kalıyor

Burada gerçek bir sorunun taslağını çizdi. CSS-Tricks'teki Özel Alanlar kutusu, bazı son derece ılımlı veritabanı sorguları için gerçekten bir suçluydu. Aynı şekilde, olası düzenlemelere yönelik çeşitli yollar da çizmiştir.

Yepyeni fikirlerin tasarlanması

Soru yürütmeyi denemek ve hızlandırmak için, sorgulamayı değiştirmek veya bir liste eklemekten daha fazla iş içeren farklı metodolojiler vardır. Sorunun en yavaş kısımlarından biri, müşteri kimliğinden öğe kimliğine gitmek için tabloları birleştirmek için yapılan çalışmadır ve bunu her müşteri için yapmak gerekir.

Tüm lisanslar için müşteri kimliği ve öğe kimliğinin yanı sıra izin bilgilerini depolayan bir tablo yaparak ve belirli bir müşteri için buna karşı sorgulama yaparak bilgileri normalleştirebilir. INSERT/UPDATE/DELETE üzerindeki MySQL tetikleyicilerini kullanan tablonun lisanslar tablosuna (veya bilgilerin nasıl değişebileceğine bağlı olarak diğerlerine) değiştirilmesi gerekir, ancak bu, bu bilgileri sorgulamanın yürütülmesini önemli ölçüde iyileştirecektir.

Bu nedenle, eğer çeşitli birleştirmeler MySQL'de soruyu hafifletirse, sorguyu en az iki artikülasyona bölmek ve bunları PHP'de bağımsız olarak yürütmek ve daha sonra sonuçları kodda toplamak ve kanalize etmek daha hızlı olabilir.